Integer literal
允许整型类型的值直接在表达式中使用。
目录语法整数字面量的形式为
其中
整数字面量(如同所有字面量一样)属于 主表达式 。 说明
1)
十进制整数字面量(基数为10)。
2)
八进制整数字面量(基数为8)。
3)
十六进制整数字面量(基数为16,字母
'a'
至
'f'
表示(十进制)数值10至15)。
4)
二进制整数字面量(基数为 2)。
整数文字的首位数字是最高有效位。 示例。以下变量被初始化为相同的值: int d = 42; int o = 052; int x = 0x2a; int X = 0X2A; int b = 0b101010; // C++14 示例。以下变量也被初始化为相同的值: unsigned long long l1 = 18446744073709550592ull; // C++11 unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14 unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C++14 unsigned long long l4 = 184467'440737'0'95505'92LLU; // C++14 字面量的类型整数字面量的类型是能够容纳该值的第一个类型,从类型列表中选择,该列表取决于所使用的数字基数和 整数后缀 被使用:
如果整数字面量的值 没有 大小后缀(自 C++23 起) 太大而无法放入后缀/基数组合所允许的任何类型中,并且编译器支持能够表示该字面量的值的扩展整数类型(例如 注释
整数字面值中的字母不区分大小写:
不存在负整数字面值。诸如 - 1 的表达式会对字面值所表示的值应用 一元减号运算符 ,该过程可能涉及隐式类型转换。 在C99之前的C语言中(但不在C++中),无后缀十进制数值若超出 long int 的表示范围,允许其类型为 unsigned long int 。
由于
最大吞噬原则
,以
auto x = 0xE+2.0; // 错误 auto y = 0xa+2.0; // 正确 auto z = 0xE +2.0; // 正确 auto q = (0xE)+2.0; // 正确 否则,会形成一个无效的预处理数字标记,导致后续分析失败。
示例
运行此代码
#include <cstddef> #include <iostream> #include <type_traits> int main() { std::cout << 123 << '\n' << 0123 << '\n' << 0x123 << '\n' << 0b10 << '\n' << 12345678901234567890ull << '\n' << 12345678901234567890u << '\n'; // 即使没有 long long 后缀,类型也是 unsigned long long // std::cout << -9223372036854775808 << '\n'; // 错误:该值无法放入 signed long long, // 这是无后缀十进制整数字面量允许的最大类型 std::cout << -9223372036854775808u << '\n'; // 一元减号应用于无符号值会从 2^64 中减去它,得到 9223372036854775808 std::cout << -9223372036854775807 - 1 << '\n'; // 计算值 -9223372036854775808 的正确方式 #if __cpp_size_t_suffix >= 202011L // C++23 static_assert(std::is_same_v<decltype(0UZ), std::size_t>); static_assert(std::is_same_v<decltype(0Z), std::make_signed_t<std::size_t>>); #endif } 输出: 123 83 291 2 12345678901234567890 12345678901234567890 9223372036854775808 -9223372036854775808 缺陷报告以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
参考文献
参见
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||