内置类型
赋给无符号类型一个超出它范围的值,结果是初始值对无符号类型表示数值总数取模后的余数。对8比特的unsigned char赋值-1得到的结果是 (-1 mod 256) = 255。
赋给带符号类型一个超出它表示范围的值时,结果是未定义的。
bool b = 42; // b为真
int i = b; // i的值为1
unsigned char c = -1; // char占8比特,c的值为255
signed char c2 = 256; // char占8比特,c2的值未定义
当一个算术表达式中既有无符号数又有int值时,int值会被转换成无符号数。把int转换成无符号数的过程和把int表示的数值直接赋给无符号变量一样。
unsigned u = 10;
int i = -42;
cout << i + i << endl; // 输出-84
cout << u + i << endl; // 如果int占32位,输出2^32-42+10
unsigned u = 10, u2 = 32; // unsigned int
cout << "u2 - u = " << u2 - u << endl; // 输出22
cout << "u - u2 = " << u - u2 << endl; // 输出(-22 mod 2^32)
int i = 10, i2 = 42;
cout << "i2 - i = " << i2 - i << endl; // 输出32
cout << "i - i2 = " << i - i2 << endl; // 输出-32
cout << "i - u = " << i - u << endl; // 输出0
cout << "u - i = " << u - i << endl; // 输出0
字面值常量
整型
0开头代表八进制,0x开头或者0X开头表示16进制。
20 // 十进制
024 // 八进制
0x14 // 十六进制
字符串
字符串字面值的类型实际上是由常量字符构成的数组,字符串的结尾处会自动添加一个空字符('\0')。
"Hello World!" // 字符串字面值
如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一个整体。
cout << "a really, really long string literal"
"that spans two lines" << endl;
指定字面值的类型
字符和字符串字面值
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode16字符 | char16_t |
U | Unicode32字符 | char32_t |
L | 宽字符 | wchar_t(双字节) |
u8 | UTF-8(仅作用于字符串字面常量) | char |
整型字面值
后缀 | 最小匹配类型 |
---|---|
u 或 U | unsigned |
l 或 L | long |
ll 或 LL | long long |
浮点型字面值
后缀 | 类型 |
---|---|
f 或 F | float |
l 或 L | long double |