文字表达式也有类型吗?
long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ;
std::cout << a << ',' << b ; // -2147483648,2147483649
答案 0 :(得分:7)
是的,字面数字有类型。未填充的十进制整数文字的类型是可以表示整数的int
,long
,long 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
答案 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的更多信息。