原码反码补码疑惑解答记录:127+1=-128


前置知识

正数:

原码符号位为0
原码=反码=补码

负数:

原码符号位为1
反码=原码除最高位以外,按位取反或者负数对应绝对值的原码全部按位取反
补码=反码+1


解析

计算机的运算在其内部是按照补码的形式计算的。
由于减法电路相较于加法电路造价更加昂贵,因此诞生的补码正是为了将减法变为另一种形式的加法而存在的。
补码:将减法运算转化为另一种形式的加法运算

127+1在计算机内 = [127]补+[1][127]= 0,1111111
[1]= 0,0000001
[127]补+[1]= 1,0000000

我们所得到的数最高位为1,因此这是一个负数的补码。
那么这个负数是多少呢?补码不好直接看出其原码形式。

但这时候的推导过程就需要注意了:

反码=`原码除最高位以外,按位取反`或者`负数对应绝对值的原码全部按位取反`
补码=反码+1
也就是补码=`原码除最高位以外,按位取反`再+1或者`负数对应绝对值的原码全部按位取反`再+1

你可以根据上面两种方法的任意一个,推出负数的补码,但是在这里想反着推回去的时候,第一种会出现错误。
两种方法最后都加一了,因此1,0000000-1肯定是没问题的,得到0,1111111
第一种方法:原码除最高位以外,按位取反
得到:00000000,是零
如果127+1就等于了零,这个编码形式的覆盖范围是不是有些小了?因此这种结果我认为是错误的 。

第二种方法:负数对应绝对值的原码全部按位取反
全部按位取反:1,000 0000
什么数的绝对值是128,-128

所以127+1才能得到-128

记得推导的时候不要使用第一种方法,求补码的时候两种方法都可以。

其实也有种负数的补码推回原码的技巧:
寻找从右侧开始的第一个1,将其左侧除符号位以外的所有数据位 按位取反

可以试试:

-8的原码: 1000 1000
-8的补码: 1111 1000

至此,结束。

如果你觉得这篇文章写的不错,多多点赞~收藏吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值