C++

C++ 知识量:19 - 82 - 316

2.1 基本内置类型><

算术类型- 2.1.1 -

C++中的算术类型包括整数类型和浮点数类型。

整数类型包括以下几种:

  • short:短整型,占16位,范围为-32768到32767。

  • int:整型,占32位,范围为-2147483648到2147483647。

  • long:长整型,占64位,范围为-9223372036854775808到9223372036854775807。

浮点数类型包括以下几种:

  • float:单精度浮点型,占32位,范围为1.2E-38到3.4E+38。

  • double:双精度浮点型,占64位,范围为2.3E-308到1.7E+308。

  • long double:长双精度浮点型,占80位或128位,范围为1.2E-4932到1.8E+4932。

带符号类型和无符号类型- 2.1.2 -

在C++中,整数类型可以分为带符号类型和无符号类型。带符号类型可以表示正数、负数和零,而无符号类型只能表示正数和零。

带符号类型包括short、int、long等,它们可以表示负数,因为它们具有符号位。在内存中,带符号类型的所有位都用于表示数值,包括符号位和数值位。

无符号类型包括unsigned short、unsigned int、unsigned long等,它们没有符号位,只能表示正数和零。在内存中,无符号类型的所有位都用于表示数值。

例如,对于一个16位的带符号整数,它的范围是-32768到32767。而对于一个16位的无符号整数,它的范围是0到65535。

需要注意的是,当将一个带符号类型的值转换为无符号类型时,如果带符号类型的值是负数,那么它在无符号类型中的表示将是不可预测的。因此,在进行类型转换时需要注意数据类型的范围和精度,以避免数据溢出或精度损失等问题。

类型转换- 2.1.3 -

在C++中,算术类型之间的转换可以通过几种不同的方式进行。以下是一些常见的类型转换方法:

1. 隐式类型转换:这是编译器自动进行的类型转换。例如,将一个整数赋值给一个浮点数时,编译器会自动将整数转换为浮点数。

int i = 10;    
float f = i;  // 隐式类型转换:将int转换为float

2. 显示类型转换:这是由程序员明确要求的类型转换。C++提供了一系列的类型转换运算符,如 static_cast、dynamic_cast、const_cast 和 reinterpret_cast,用于在不同的类型之间进行转换。

int i = 10;    
double d = static_cast<double>(i);  // 显示类型转换:将int转换为double

3. 算术类型提升:这是C++编译器的一种行为,它将较小的算术类型(如char和short)转换为较大的算术类型(如int和long)。这主要是为了避免在较小类型上进行操作时产生溢出。

char c = 'A';    
int i = c;  // 算术类型提升:将char转换为int

4. 算术类型转换:这是C++编译器的一种行为,它将较大的算术类型(如long和double)转换为较小的算术类型(如int和float)。这主要是为了减少存储空间和计算时间。需要注意的是,这种转换可能会造成精度损失。

double d = 3.14;    
float f = d;  // 算术类型转换:将double转换为float

在进行算术类型转换时,必须注意数据类型的范围和精度,以避免数据溢出或精度损失等问题。同时,也需要注意类型转换的安全性,以避免出现不兼容或不安全的类型转换。

字面值常量- 2.1.4 -

在C++中,字面值常量指的是直接在代码中使用的具体数值。这些常量在程序运行时期不能改变。

C++中的字面值常量可以是整数、浮点数、字符或字符串。

  • 整数字面值常量:可以直接以十进制、八进制或十六进制的形式表示。例如:123、07、0X1A。

  • 浮点数字面值常量:由整数部分和小数部分组成,如:3.14、1.234e+7。

  • 字符字面值常量:用单引号括起来的单个字符,如:'A'、'B'、'a'。

  • 字符串字面值常量:用双引号括起来的一串字符,如:"Hello, world!"。

注意:在C++中,字面值常量被视为const类型,这意味着它们在编译时期就已经确定,并且之后不能被修改。例如,如果尝试修改一个整数字面值常量,编译器将会报错。

转义序列- 2.1.5 -

C++中的转义序列是一种特殊的字符序列,它们用于表示无法直接输入的字符或具有特殊含义的字符。以下是一些常见的C++转义序列:

  • \n:换行符,表示新的一行开始。

  • \t:制表符,表示一个制表位。

  • \b:退格符,表示将光标向左移动一个位置。

  • \r:回车符,表示将光标移动到当前行的末尾。

  • ":表示引号字符。

  • ':表示单引号字符。

  • ":表示双引号字符。

  • \:表示反斜杠字符。

  • \0:表示空字符。

  • \xHH:表示十六进制字符,其中HH是两个十六进制数字。

  • \uHHHH:表示Unicode字符,其中HHHH是四个十六进制数字。

  • \UHHHHHHHH:表示Unicode字符,其中HHHHHHHH是八个十六进制数字。

这些转义序列可以在字符串中直接使用,例如:

std::cout << "Hello\nworld!"; // 输出两行:Hello和world!      
std::cout << "Tab\tcharacter"; // 输出一行,其中的Tab字符用制表符表示      
std::cout << "Quoted\" character"; // 输出一行,其中的引号字符用转义序列表示

指定字面值的类型- 2.1.6 -

在C++中,可以通过添加前缀和后缀来指定字面值的类型。以下是关于整型、浮点型和字符型字面值如何改变其默认类型的说明:

1. 整型字面值:

  • 十进制:默认情况下,整数字面值被视为int类型。例如:123。

  • 长整型(Long):通过在数字前添加L或l(注意:在某些编译器中,l可能与1混淆,因此推荐使用L)来指定一个整数字面值为long类型。例如:123L。

  • 长长整型(Long Long):在C++11及以后的版本中,可以使用LL或ll作为后缀来指定long long类型。例如:123LL。

  • 无符号:使用U或u后缀可以指定一个无符号整数字面值。例如:123U。

  • 无符号长长整型:结合使用UL、uL、ULL或ull可以指定一个无符号的long long字面值。例如:123ULL。

2. 浮点型字面值:

  • 默认:浮点数字面值默认为double类型。例如:3.14。

  • 单精度(Float):通过在数字后添加F或f来指定一个浮点数字面值为float类型。例如:3.14F。

  • 长双精度(Long Double):使用L或l(同样,推荐使用L以避免混淆)作为后缀可以指定一个long double类型的浮点数字面值。例如:3.14L。

3. 字符型字面值:

  • 默认:字符字面值默认为char类型。例如:'a'。

  • 宽字符(Wide Character):通过在字符前添加L来指定一个宽字符字面值,它是wchar_t类型。例如:L'a'。

  • UTF-8字符:在C++11及以后的版本中,可以使用u8前缀来指定一个UTF-8字符字面值。例如:u8'a'。

  • UTF-16字符:使用u或U前缀,后跟一对十六进制数字来指定一个UTF-16字符字面值。例如:u'0061'或U'00000061'。

  • UTF-32字符:使用U前缀,后跟一对十六进制数字来指定一个UTF-32字符字面值。例如:U'00000061'。