补码10000000和原码10000000的比较讨论

本文澄清了10000000在不同编码方式下的真值解释,探讨了补码10000000的规定与运算原理,以及为何-0的补码是00000000而非-128。通过实例和规则解析了补码和溢出的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  二进制原码10000000,真值为-0,反码为11111111,补码为100000000,溢出1,舍去模之后为00000000。

  机器码10000000,作为原码时为-0,反码时为-127,补码时为-128

  规定[x]补=10000000时,x真值为-128,可以扩充范围,并无其他意义。此时的x在八位二进制下没有原码。

  放出一个表格,是机器码作为原码反码补码移码时,对应的x的数值,即真值

(图片来源于学校教学ppt和王道考研视频,侵权删)

  写本篇博客是因为期末复习看ppt误解了老师表格的意思,把机器码,作为原码反码补码时,对应的x的真值为多少,看成了机器码作为真值时,对应的原码反码补码表示的数值,产生了10000000的补码为-128的误会,实际上10000000,即-0的补码为00000000,作为补码时对应的真值为-128。

———————————————————————————————————————————

补充:

10000000作为补码时,真值规定为-128不是没有依据的,因为对于补码有一个特性,对于负数来说,将补码看成无符号数,用2^(n+1)减去这个无符号数,得到的数就是补码对应真值的绝对值的原码,也就是负数原码符号位取反,相当于钟表轮盘式的抽象概念,原码加补码正好为一圈,n位数的2^(n+1)。再看符号,符号位为1则为负数,0为正数。

所以,10000000作为无符号数为128,用256-128得到128,符号位为1,得到-128。

除此之外,为了使移码保持从小增大的特性,也需要如此规定。

在补码加减运算中,-64的补码11000000自身相加,得到10000000,就是-128的补码,没有发生溢出现象。


补充:

在求解补码时,若原码表示的数值为负数,那么可以通过一种简便方法进行计算:

将原码中从右往左数第一个“1”位和其右部分所有的数值保持不变,左侧除符号位全部取反,符号位保持不变,这样可以得到一个准确的补码数值。

但是此方法需要有几点注意事项,第一点,原码若为-0,即10000000,此方法不可使用,-0对应的补码只能是00000000,溢出的1舍去。

第二点,不论是此方法还是正常的补码求解方法,都不能得到补码10000000,此补码不在运算范围内,认为规定其为-128。

对于其余所有补码,均可成立。 


补充:

关于[-x]补和[x]补的运算:

可以采取,所有的位数全取反再加1的方法

但是同样地,有几点需要注意:

首先是-0和+0的补码,因为出现了进位舍去的原因,因此保持正确结果

即00000000不论表示-0还是+0,其补码都为其本身

对于其他所有正数来说,此规则成立,因为此方法相当于对其相反数(负数)先求补码,即先符号位取反,再求其补码,比如00000001,相当于对原码为10000001真值为-1的数求补码,得到11111111,即为-1的补码

对于除10000000外所有的负数,相当于先求其补码,再符号位取反,因为补码的补码为其原码,且除了10000000机器数外不存在进位,因此相当于对负数求出原码,再符号位取反得到其相反数(正数)的原码,其补码为其原码,因此也成立

但是对于10000000来说,此规则不可适用,最直观的一点就是,-128不能在8位二进制内求出其相反数的补码。用该规则求出补码后,依然得到10000000,为-128的补码,为其本身。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不看美女三天即死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值