C++文字整数类型

Abh*_*hak 2 c++ int integer-overflow long-integer

文字表达式也有类型吗?

long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ; 
std::cout << a << ',' << b ; // -2147483648,2147483649
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 7

是的,字面数字有类型.类型的无后缀十进制整数字面的是第一的int,long,long long其中,所述整数可以被表示.二进制,十六进制和八进制文字的类型类似地选择,但在列表中也使用无符号类型.

您可以使用U后缀强制使用无符号类型.如果L在后缀中使用单个,那么类型将至少是,longlong long如果它不能表示为a,则可能是long.如果使用LL,那么类型必须是long long.

其结果是,如果int是32位的类型和long为64位,则2147483647有类型int2147483648已经键入long.这意味着2147483647+1将溢出(这是未定义的行为),而2147483648+1简单2147483649L.

这由[lex.icon]C++标准的第2.3.12()段第2段定义,以上描述是该部分表7的摘要.

重要的是要记住,赋值的目标类型不会以任何方式影响赋值右侧的表达式的值.如果要强制计算得到long long结果,则需要强制计算的某个参数long long; 仅仅分配给long long变量是不够的:

long long a = 2147483647 + 1LL;
std::cout << a << '\n';
Run Code Online (Sandbox Code Playgroud)

产生

2147483648
Run Code Online (Sandbox Code Playgroud)

(住在coliru)

  • @ m7913d:是的,该标准正好说“相应列表的第一个”。我添加了引文。(它不是可以表示它的最小整数类型;永远不会是`char`或`short`。) (2认同)