原反补码已经有很多佬用同余数的方法详细的解释了,但我还是有一个问题
比如-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 (进制能表示的最大数),这样也就很好理解了