c中%d的方式显示2个不同的变量,输出的结果为什么一样

#include
#include

void main()
{
int x = -1; // 32个1
int y = 4294967295;// 32个1

printf("\n%d", x); //以有符号的方式显示为何都是-1
printf("\n%d", y);// 以有符号的方式显示为何都是-1

getchar();
}

//猜想,是否这2个变量以%d的方式输出的时候是先转换成原码再输出的?

3个回答

可以联系变量在内存中的存储方式来解决这个问题。您定义的是有符号整形变量,在内存中占据32位,最高位为符号位。4294967295在内存中为11111111111111111111111111111111。最高位为1,可知是负数。而我们知道:数值在计算中一律用补码,已知一个数的补码,求原码的操作其实就是对该补码再求补码,求负数的补码时:符号位不变。剩下的位按位取反+1;所以为:0000000000000000000000000000+1=0000000000000000000000000000001,加上符号位,可知是-1

因为4294967295超过了int允许的最大值(2147483647),造成了上溢,此时y等于-1。

y超过int最大值,溢出了,所以就转换到负数了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐