先到这一步, -1的反码表示是1111 1110. 如果这里将[1111 1110]认为是原码, 则[1111 1110]原 = -126, 这里将符号位除去, 即认为是126.
发现有如下规律:
(-1) mod 127 = 126
126 mod 127 = 126
即:
(-1) ≡ 126 (mod 127)
2-1 ≡ 2126 (mod 127)
2-1 与 2126的余数结果是相同的! 而这个余数, 正式我们的期望的计算结果: 2-1=1
所以说一个数的反码, 实际上是这个数对于一个膜的同余数. 而这个膜并不是我们的二进制, 而是所能表示的最大! 这就和钟表一样, 转了一圈后总能找到在可表示范围内的一个正确的数!
而2126很显然相当于钟表转过了一轮, 而因为符号位是参与计算的, 正好和溢出的最高位形成正确的运算结果.
既然反码可以将减法变成加法, 那么现在计算机使用的补码呢? 为什么在反码的基础上加1, 还能得到正确的结果?
2-1=2(-1) = [0000 0010]原 [1000 0001]原= [0000 0010]补 [1111 1111]补
如果把[1111 1111]当成原码, 去除符号位, 则:
[0111 1111]原= 127
其实, 在反码的基础上1, 只是相当于增加了膜的:
(-1) mod 128 = 127
127 mod 128 = 127
2-1 ≡ 2127 (mod 128)
此时, 表盘相当于每128个刻度转一轮. 所以用补码表示的运算结果最小和最大应该是[-128, 128].
但是由于0的特殊情况, 没有办法表示128, 所以补码的取范围是[-128, 127]
本人一直不善于数学,每次都害怕计算进制转换和 反码补码等今天看到后瞬间明白,不要让一个问题绊倒你太久,不然每次遇到了都是个坑,曾经因为这是去一个好工作的机会呢! 所以如果文中有不对的地方请大家多多包含, 多多指点!
作者:旅大市
出处:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29941-4.html
是1888年
看的很清楚