C ++文字整数类型

时间:2017-03-19 21:03:01

标签: c++ int long-integer integer-overflow

文字表达式也有类型吗?

long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ; 
std::cout << a << ',' << b ; // -2147483648,2147483649

2 个答案:

答案 0 :(得分:7)

是的,字面数字有类型。未填充的十进制整数文字的类型是可以表示整数的intlonglong long中的第一个。类似地选择二进制,十六进制和八进制文字的类型,但也在列表中使用无符号类型。

您可以使用U后缀强制使用无符号类型。如果您在后缀中使用单个L,则类型将至少为long,但如果无法将其表示为long long,则可能为long。如果您使用LL,则类型必须为long long

结果是,如果int是32位类型且long是64位,则2147483647具有类型int,而2147483648具有类型long。这意味着2147483647+1将溢出(这是未定义的行为),而2147483648+1只是2147483649L

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

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

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

生成

2147483648

live on coliru

答案 1 :(得分:0)

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的更多信息。