为什么这个简单的C程序会打印-2147483648
?
#include <stdio.h>
int main(){
printf("%i", (int)2147483648);
return 0;
}
当然,如果我不进行转换并使用%lld
作为格式说明符,我会得到预期的输出。
答案 0 :(得分:3)
2147483647是您平台上int
的最大值。
2147483648 == 0x80000000具有与-2147483648相同的二进制表示形式,这就是您获得该结果的原因。
答案 1 :(得分:2)
将整数转换为较小的有符号类型时,如果无法在新类型中表示该值,则行为是实现定义的:
6.3.1.3
当整数类型的值转换为另一个整数类型时 除了_Bool之外,如果值可以用新类型表示,那么 没有改变。
[...]
否则,新类型已签名且无法表示该值 在里面;要么结果是实现定义,要么是 提出了实现定义的信号。
答案 2 :(得分:0)
当您转换为int
时,您(至少在当前平台上)会转换为32位有符号数字。可以存储在该空间中的最大正值是2147483647.当您添加1时,您将翻转到最大负值,即输出。
使用long long int
时,我认为最小宽度为64位。您可以轻松地在该空间中保存值2147483648,因此输出正如您所期望的那样。
答案 3 :(得分:0)
在32位二进制补码系统中,最大int
通常为:
2147483647
所以
2147483648
是long
值。
当值无法适合签名类型时,将值转换为有符号类型是实现定义的。