原码反码补码,以十进制来理解

        原反补码已经有很多佬用同余数的方法详细的解释了,但我还是有一个问题

        比如-1的同余数是126,因此  (x+126)%127 = x - 1

但,为什么能用反码的形式求出同余数呢?

今天我就来谈谈如何从其他进制的角度来理解原反补码

        我们来看一个不带符号位的四位十进制的例子:

        9876 - 1234

        我们怎么以加法的形式进行十进制减法呢?

        -1234 = +(10000 - 1234) % 10000

        我们都知道,正负数的补码之和就是他们相减的结果,那这里(10000 - 1234) = 8766 就是

- 1234的补码,而8765就是其反码。

这个反码是怎么来的?   

每一位用该进制的最大可表示数 - 原码这一位的数,对这个四位十进制来说,就是 9999 - 1234。是不是和二进制很类似?实际上,反码本质上是每一位用1 - 原码上该位的数,而并不是简单的“反”。

        那怎么证明这种做法的正确性呢?其实很简单:(10000 - 1) - 1234 + 1:这个式子也很直观的表示了取反以及+1得到补码的过程。同时,它也解释了我们为什么要多此一举使用反码这个中间值,因为反码的每一位是由该进制最大值 - 原码的这一位的值,从而避免了退位。

        再回到这个式子 :9876 -1234 =9876 +(10000 - 1234) % 10000。%的操作并不好实现,那这个又是如何处理的?

这就要提到我们的符号位了

        我们把这个四位十进制变为五位,第一位是符号位。那么问题又来了,对于二进制,我们可以很简单地把符号位归为0 和 1,但十进制的符号位要怎么写呢?

        我们先试着用1作为负号,这样原式就变成了 09876 - 11234。

        化成补码得:09876 + 18766 = 28642;

        我们可以发现,它的符号位进位了,也就是说9876 + ((10000 - 1) - 1234 + 1) + 10000 > 20000 (多加了个10000是因为以1为符号位多了10000)

即:9876 - 1234 > 0 

        首位是二这个点意义不大,因为它的值取决于符号位的定义,但进位这点就很有意思了,通过上面的式子我们可以看出

        进位就说明结果为正。

那么,假如我们把十进制的符号位定成 9 为负,0 为正呢?进位的时候,符号位会自动变为0,而进位的1因为超出了上限自动忽略,于是,它变成了正数。

        二进制也是同理,只不过把十进制的 9 全部变成 1 (进制能表示的最大数),这样也就很好理解了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值