在 C 语言中,
unsigned int size = 1024*1024*1024*2;
该操作会导致一个警告:"表达式中的整数溢出..."。同时,
unsigned int size = 2147483648;
结果没有警告吗?
第一个表达式的正确值是否默认为int?C99规范在哪里提到了这一点?
在没有任何后缀的十进制常量中,其类型为可以表示的第一个类型(根据当前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
。
INT_MAX == LONG_MAX
,否则第二个表达式可能是long long int
类型。请注意,Win64是一个64位环境,在这里INT_MAX == LONG_MAX
;大多数32位环境都以INT_MAX == LONG_MAX
运行。 - Jonathan Lefflerunsigned int size = 1024*1024*1024*2;
1024*1024*1024*2
(在表达式中,1024
和 2
的类型为 signed int
)产生的结果是 signed int
类型的,而这个值对于 signed int
来说太大了。因此,你会收到警告。unsigned int
。1024
和 2
是有符号整数,所以乘法结果也是 signed int
类型,然后在分配给 unsigned int
时更改了类型。 - ameyCU1024*1024*1024*2
溢出,而int
溢出是UB。最好使用1024u*1024*1024*2
。 - chux - Reinstate Monica
2147483648
吗? - abhishek_naik2147483648
。我的答案是基于此假设的。 - 2501