C++ 文字整数类型

C++ literal integer type

文字表达式也有类型吗?

long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ; 
std::cout << a << ',' << b ; // -2147483648,2147483649
int a = INT_MAX ;
long long int b = a + 1 ; // adds 1 to a and convert it then to long long ing
long long int c = a; ++c; // convert a to long long int and increment the result with 1
cout << a << std::endl; // 2147483647
cout << b << std::endl; // -2147483648
cout << c << std::endl; // 2147483648
cout << 2147483647 + 1 << std::endl; // -2147483648 (by default integer literal is assumed to be int)
cout << 2147483647LL + 1 << std::endl; // 2147483648 (force the the integer literal to be interpreted as a long long int)

您可以找到有关整数文字的更多信息 here

是的,文字数字有类型。无后缀十进制整数文字的类型是intlonglong long中第一个可以表示整数的类型。二进制、十六进制和八进制文字的类型选择类似,但列表中也有无符号类型。

您可以通过使用 U 后缀强制使用无符号类型。如果您在后缀中使用单个 L,则类型至少为 long,但如果不能表示为 long,则可能为 long long。如果您使用 LL,则类型必须是 long long(除非实现扩展类型比 long long 更宽)。

结果是如果 int 是 32 位类型而 long 是 64 位类型,那么 2147483647 的类型是 int2147483648类型为 long。这意味着 2147483647+1 会溢出(这是未定义的行为),而 2147483648+1 只是 2147483649L.

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

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

long long a = 2147483647 + 1LL;
std::cout << a << '\n';

产生

2147483648

(live on coliru)