首页 热点资讯 义务教育 高等教育 出国留学 考研考公

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

发布网友 发布时间:2022-04-25 15:42

我来回答

5个回答

热心网友 时间:2023-10-13 22:44

一般情况下是补零,但在处理有符号数的时候会因计算机系统的不同而不同。有符号数高位是零,则右移时高位补零;如果是负数,即高位是1,那么,有得系统会移入1,称算术右移,有的会移入0,称逻辑右移。
如果高位补 0,结果就是1如果高位补1, 结果就是-1

热心网友 时间:2023-10-13 22:45

-3 在内存中表示的话最高位是符号位 负数为 1

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

右移31位的话那么最后的数就是 0xffffffff了。
这个在内存中表示的就是有符号数的 -1

热心网友 时间:2023-10-13 22:45

右移操作时,连同符号位同时移动,且符号位是1(负数)时,补1,符号位是0(正数)时补0。char a = -3(-3) = (11111101)2事实上,右移2位后,该数为11111111,次数已经是-1了。

热心网友 时间:2023-10-13 22:46

C语言中,假设你的机器字长一个字节是32位,那么你注意:-3在计算机补码中表示:1111 1111 1111 1111 1111 1111 1111 1101右移(带符号)31位:1111 1111 1111 1111 1111 1111 1111 1111(最后一个1是原先最高的符号位的那个1)。这串数字的补码的原码是-1

热心网友 时间:2023-10-13 22:46

-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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com