在C中,
unsigned int size = 1024*1024*1024*2;
导致警告“表达式中的整数溢出...” 而
unsigned int size = 2147483648;
结果没有警告?
第一个表达式的正确值是否默认为int?它在C99规范中提到了什么?
答案 0 :(得分:11)
当使用没有任何后缀的十进制常量时,十进制常量的类型是第一个可以按顺序表示的(当前C标准,6.4.4常量p5):
第一个表达式的类型是int
,因为值为1024和2的每个常量都可以表示为int。这些常量的计算将在int类型中完成,结果将溢出。
假设INT_MAX等于2147483647且LONG_MAX大于2147483647,则第二个表达式的类型为long int
,因为此值不能表示为int,但可以表示为long int。如果INT_MAX等于LONG_MAX等于2147483647,则类型为long long int
。
答案 1 :(得分:3)
unsigned int size = 1024*1024*1024*2;
此表达式1024*1024*1024*2
(在表达式1024
和2
中的类型为signed int
)生成类型为signed int
的结果,此值也是大signed int
。因此,您会收到警告。
在有符号的乘法之后,它被分配给unsigned int
。