C 将长整型打印为int输出负值
为什么这个简单的C程序会打印C 将长整型打印为int输出负值,c,casting,int,printf,C,Casting,Int,Printf,为什么这个简单的C程序会打印-2147483648 #include <stdio.h> int main(){ printf("%i", (int)2147483648); return 0; } #包括 int main(){ printf(“%i”,(int)2147483648); 返回0; } 当然,如果我不强制转换它并使用%lld作为格式说明符,我将获得预期的输出。将整数转换为较小的有符号类型时,如果值不能在新类型中表示,则行为是实现定义的: 6.3
-2147483648
#include <stdio.h>
int main(){
printf("%i", (int)2147483648);
return 0;
}
#包括
int main(){
printf(“%i”,(int)2147483648);
返回0;
}
当然,如果我不强制转换它并使用
%lld
作为格式说明符,我将获得预期的输出。将整数转换为较小的有符号类型时,如果值不能在新类型中表示,则行为是实现定义的:
6.3.1.3
将整数类型的值转换为其他整数类型时
除了_Bool,如果值可以用新类型表示,则
没有变化
[……]
否则,将对新类型进行签名,并且无法表示该值
在它里面;结果要么是实施明确,要么是
提出了实施定义的信号
当您转换为
int
时,您(至少在当前平台上)转换为32位有符号数字。该空间中可存储的最大正值为2147483647。当您添加1时,将滚动到最大负值,即输出
使用
long-long-int
时,我相信最小宽度是64位。您可以轻松地将值2147483648保存在该空间中,因此输出与预期一致。2147483647是平台上的最大值int
2147483648==0x80000000具有与-2147483648相同的二进制表示形式,这就是您得到该结果的原因。在32位2的补码系统上,最大
int
通常为:
2147483647
所以
是一个long
值
实现定义了当值不能放入已签名类型时将值转换为已签名类型的过程。我在哪里可以阅读有关“已定义”行为的信息?只有当它溢出时,这才可以:
(int)(unsigned long long)3
@nightcracker Good call,修正了措辞。您没有阅读吗?我5分钟前读过,在同一个问题上停顿了一分钟。
2147483648