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)
是的,字面数字有类型.类型的无后缀十进制整数字面的是第一的int,long,long long其中,所述整数可以被表示.二进制,十六进制和八进制文字的类型类似地选择,但在列表中也使用无符号类型.
您可以使用U后缀强制使用无符号类型.如果L在后缀中使用单个,那么类型将至少是,long但long long如果它不能表示为a,则可能是long.如果使用LL,那么类型必须是long long.
其结果是,如果int是32位的类型和long为64位,则2147483647有类型int而2147483648已经键入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)