本章术语:
- 算数类型(arithmetic type):字符、整型数、布尔值、浮点数
- 空类型(void)
- 字面值常量(literal)
- 转义序列(escape sequence)
char16_t
和 char32_t
类型为 Unicode 字符集服务。
字符类型有三种: char
、 signed char
和 unsigned char
三种,
但实际的表现形式只有 signed char
和 unsigned char
两种。
char
会具体表现为这两种之一。具体是哪种有编译器决定。
类型的选取准则:
- 当明确知道数值不可能为负时,选用无符号类型。
- 使用
int
执行整数运算。如果数值超出了int
的表示范围,则使用long long
。 - 算数表达式中不要使用
char
或bool
,它们只用来存放字符或布尔值。
如果需要使用一个不大的整数,需要明确指出其类型是signed char
或是unsigned char
。 - 使用
double
执行浮点数运算,float
通常精度不够,并且两者计算代价相近。
类型转换过程:
- 当把一个非布尔类型的算数值赋给布尔类型时,初始值为 0 的结果为 false ,否则结果为 true 。
- 当把一个布尔值赋给非布尔类型时,初始值为 false 则结果为 0 ,初始值为 true 则结果为 1 。
- 当把一个浮点数赋给整数类型时,结果仅保留小数点之前的部分。
- 当把一个整数值赋给浮点类型时,小数部分记为 0 。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。
- 当赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。
- 当赋给带符号类型一个超出它表示范围的值时,结果是未定义的。程序可能继续工作、可能崩溃,也可能产生垃圾数据。
当一个算数表达式中既有无符号数又有 int 值时,那个 int 值就会转换成无符号数。
当从无符号数中减去一个值时,不管这个值是不是无符号数,都必须确保结果非负。
切勿混用带符号类型和无符号类型
0 开头的整数代表八进制数,以 0x 或 0X 开头的代表十六进制数。
默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。
浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用 E 或 e 标识。
由单引号括起来的一个字符称为 char 型字面值,双引号括起来的零个或多个字符构成字符串型字面值。
如果两个字符串字面值位置紧邻且仅由空格、缩进、换行符分隔,则它们实际上是一个整体。如:
std::cout << "a really, really long string literal "
"that spans two lines" << std::endl;
泛化转义序列: \x
后紧跟十六进制数字, \
后紧跟八进制数字。
如果反斜线后面跟着的八进制数字超过 3 个,则只有前 3 个数字与 \
构成转义序列。而 \x
要用到后面跟着的所有数字。
字符和字符串字面值
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode 16 字符 | char16_t |
U | Unicode 32 字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面常量) | char |
整型字面值
后缀 | 最小匹配类型 |
---|---|
u / U | unsigned |
l / L | long |
ll / LL | long long |
U 可以与 L 或 LL 合在一起使用。
浮点型字面值
后缀 | 类型 |
---|---|
f / F | float |
l / L | long double |
true 和 false
nullptr