Why does this simple C program print -2147483648
?
#include <stdio.h>
int main(){
printf("%i", (int)2147483648);
return 0;
}
Of course if I don't cast it and use %lld
as the format specifier I get the expected output.
int
2147483647 是您平台上的最大值。
2147483648 == 0x80000000 与 -2147483648 具有相同的二进制表示,这就是你得到这个结果的原因。
将整数转换为较小的有符号类型时,如果值不能在新类型中表示,则行为是实现定义的:
6.3.1.3
当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则保持不变。
[...]
否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。
在 32 位二进制补码系统上,最大值int
通常为:
2147483647
所以
2147483648
是一个long
值。
当值不适合有符号类型时,将值转换为有符号类型是实现定义的。
当您转换为 时int
,您(至少在您当前的平台上)转换为 32 位有符号数字。可以存储在该空间中的最大正值是 2147483647。当您添加 1 时,您将翻转到最大的负值,即输出。
当您使用 时long long int
,我相信最小宽度是 64 位。您可以轻松地将值 2147483648 保存在该空间中,因此输出与您预期的一样。