为什么补码是取反加 1?
网上随便一搜关于补码的文章,基本都是:用原码得出反码,然后再加 1,就能得出补码。
首先不能否定这个方法的正确性,但却体现不出计算机的精妙之处。
先介绍一下补码的作用和原本的计算方法:
1、二进制的原码及正负表示
比如现在有一个 4 位长度的二进制数,那么最高位用来作为符号位区分,比如 0010 代表 2,1001 代表-1
但是用原码计算 1+(-1)的时候,结果是不对的。会等于 1011 即-3
2、补码:负数原码取反+1
那么怎么解决原码计算不正确的问题,便引入了负数取反+1 的表示方法,比如 0010 依旧代表 2,但是用 1001 的反码+1(符号位不变,其余位取反):1111 来代表 -1。此时 2+(-1)=0010+1111(补码)=0001(补码)=0001(补码)=1,结果是正确的。
把原本的计算过程弄清楚之后,会不会引发一种想法:为什么补码就得是取反+1 呢?
补码与时钟
在一个表盘里面,12-1=11 点 与 12+11=11 点是等效的,相当于时针往前拨和往后拨的区别。假如这个时钟是 16 小时呢,那么-1 与 15 也是等效的。而 15 的二进制 1111 刚好等于-1 的补码。并且这样计算机就可以用加法来替代减法了。
到这里是不是明白了?取反加 1 只是补码的一种快捷计算的方式,而不是补码的定义。这个推理的过程恰恰就是补码的精妙之处。换个说法,在表盘里面补上 11 刚好就是减 1,所以就叫补码(complement)吧
这个过程其实有严谨的数学推导,这里就不涉及了。
版权声明: 本文为 InfoQ 作者【Dinfan】的原创文章。
原文链接:【http://xie.infoq.cn/article/afdf49df4ea6cf8d61afa1342】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论