有这样一道题目
int main()
{
char x=0xFFFF;
printf("%d\n",x--);
}
题目最后的答案是输出-1
在网上查了相关资料,说是关于补码与原码转换的
但是看完之后仍然觉得有疑问
疑问1:十六进制在内存中是否是转化为二进制原码之后再以补码储存的?
疑问2:后面那个x--的作用是什么呢?
疑问3:自减符号是不是在二进制运算上相当于原来的补码加了个负一的补码?
求大佬解答
有这样一道题目
int main()
{
char x=0xFFFF;
printf("%d\n",x--);
}
题目最后的答案是输出-1
在网上查了相关资料,说是关于补码与原码转换的
但是看完之后仍然觉得有疑问
疑问1:十六进制在内存中是否是转化为二进制原码之后再以补码储存的?
疑问2:后面那个x--的作用是什么呢?
疑问3:自减符号是不是在二进制运算上相当于原来的补码加了个负一的补码?
求大佬解答
计算机只有二进制没有什么十六进制,也没有什么原码、补码转换。
计算机内部并不知道一个数字是正还是负数,它只是做简单的加减运算,多了丢掉进位,少了自动借位。
而一个数字到底是正数还是负数,是printf去解释的。
char x=0xFFFF;
因为char是1byte的,所以高位丢掉,变成char x = 0xff
printf("%d\n",x--);
对于x--来说,它是先表达式求值,再减去1,所以相当于printf("%d\n",x);x = x-1;
因为是有符号整数,所以0xff被扩展成0xffffffff,所以输出-1
一个类比就是时钟,时钟有12个刻度,指针从12 1 2 3 4 ... 11然后指向12
对于一个时钟来说,它只有一个动作,就是沿着顺时针的方向这么走,很简单,它不需要搞清楚1 = 12 + 1 - 12,也不用搞清楚什么是上午什么是下午。
首先,它是一个圆环,走完11自动就到了0点。其次,时钟的上午、下午是人为规定的。
一样的道理,0xff + 1 = 0x(1)00,这个1是假想的进位,其实就是0。反过来说 0x00-1=(0x100-1-0x100)=0xff(-0x100),这里的0x100也是假想的,实际上就是0xff,然后我们就把0xff不当作255,当作了-1