[Note]对于补码的思考

补码是什么?

       我想先举一个例子,二进制中,假设我们用3个位表示3,对应二进制是011,2对应的二进制是010,2+3,对应的是011+010=101,对应的二进制是5。

       可以看到,在不溢出的情况下,加法在二进制中是显然成立的。那么,怎么计算减法呢?

在以前做数学题的时候,老师告诉过我一个特别有用的方法,那就是,遇到一个不会的问题的时候,就想办法把它转化成一个已经解决过的问题,然后用同样的方法解决它。运用这个方法论,我想把减法也转化成加法。

那么,怎么将减法转化成加法呢?例如,怎么把3-2=1转化呢?3加上一个什么数会等于1?为了得到答案,对3的二进制011进行研究,发现了,011+001=100,100+001=101,101+001=110,110+001=111,持续递增,在111+001=000,000+001=001,这里,数据虽然溢出了,但是011在连续加了6个1之后,等于了001。

所以,011+110=001,此时,用加法就实现了减法,依靠了溢出的机制。实现了减法,那么补码自然而然就出现了,3-2=3+(-2),为了表示-2,需要用补码来表示它,科学家规定-2的补码一定要保留110这个code,因为它方便用于计算。为了将它和6的二进制区分开,多增加一个bit,写成1_110,最高位为1时表示-2,为0时表示6。

验证一下,+3+(-2)=0_011+1_110=0_001,满足数学要求。

因此,补码的出现,其实是依靠了溢出的机制,计算x+(-y),应该说是先让第一个乘数x溢出,然后再加x-y+1,得到补码,所以,  (7-x)+(x-y+1)=8-y,因此-2的补码等于8-2=6,二进制1_110,-7的补码等于8-7=1,二进制1_001。

我们常说补码是源码取反加1,实际上取反,就是7-y的操作,取反加1就是7-y+1,等于8-y。

补码的英文是two's complement,对应的意思我猜测是“2^n的补充“, 正如在使用3bit的位数时,补码是2^3-y。

反码的英文是 One's complement,这是因为原码加上反码得到的是全为 1 的二进制,所以这个翻译的意思就是原码相对于全 1 的编码的补,也就是字面意思。

补码的英文是 Two's complement,一个 n 位的二进制数,其模为 $2^n$,一个负数 m 的补码即为 $2^n + m$,所以这里的翻译就是相对于模来说的。

你可能感兴趣的:(芯片设计)