C语言中位操作-3>>31值为什么是-1?

C语言中位操作-3>>31值为什么是-1?请讲解下值为什么是-1?是把哪位向右移31位?是符号那位右移吗? -1是怎么得出的? 请讲解下具体得出的过程,谢谢

一般情况下是补零,但在处理有符号数的时候会因计算机系统的不同而不同。有符号数高位是零,则右移时高位补零;如果是负数,即高位是1,那么,有得系统会移入1,称算术右移,有的会移入0,称逻辑右移。
如果高位补 0,结果就是1如果高位补1, 结果就是-1
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-09
-3 在内存中表示的话最高位是符号位 负数为 1

做右移的话最高位会用1填充。

右移31位的话那么最后的数就是 0xffffffff了。
这个在内存中表示的就是有符号数的 -1
第2个回答  2013-09-09
右移操作时,连同符号位同时移动,且符号位是1(负数)时,补1,符号位是0(正数)时补0。char a = -3(-3) = (11111101)2事实上,右移2位后,该数为11111111,次数已经是-1了。
第3个回答  2013-09-09
C语言中,假设你的机器字长一个字节是32位,那么你注意:-3在计算机补码中表示:1111 1111 1111 1111 1111 1111 1111 1101右移(带符号)31位:1111 1111 1111 1111 1111 1111 1111 1111(最后一个1是原先最高的符号位的那个1)。这串数字的补码的原码是-1
第4个回答  2023-08-22
-3的原码是
10000000 00000000 00000000 00000011,因为计算机只对补码进行操作
-3是负数, -3的反码=原码(符号位不变, 其他位取反),-3的补码=-3的反码+1
反码=11111111 11111111 11111111 11111100
补码=11111111 11111111 11111111 11111101
这时候才可以进行右移操作, -3>>31,右移一位最左边空着,补上符号位
移动一次:
补码=11111111 11111111 11111111 11111110
移动二次(左边是补上了符号位的):
补码=11111111 11111111 11111111 11111111
然后以后的29次移动的补码不变,故不展示
计算机展示的结果是原码,所以补码又要变成原码,方法: 因为补码最左的符号位是1,所以原码是负数, 负数的补码变成原码,要先变成反码,负数的反码=负数的补码-1, 负数的原码=负数的反码(符号位不变,其他位取反)
反码=11111111 11111111 11111111 11111110(补码-1)
原码=10000000 00000000 00000000 00000001(符号位不变,其他位取反)
故,展示的结果为-1

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网