如何你看到了这篇文章,想必你应该是一个爱思考,善于学习的人!
我们经常说:补码=反码+1,但为什么要这样去定义补码呢?补码,反码被早期计算机学家设计出来的目的是什么呢?
下面我们就对上面的问题进行详细解答。
ps:以下的举例都用8位二进制。
1.原码的诞生,原码的弊端
-
原码诞生
我们都知道,对于计算机只识别0和1,那么我们如何用计算机中二进制去表示我们生活中的十进制数字呢?
首先,对于生活中十进制的正数,我们计算机中的二进制可以很好的表示出来,比如18就是0001 0010;
对于十进制负数,我们二进制该如何去表示呢,在计算机中可没有负号(-),那么我们该如何规定负数呢?
这时我们发现二进制的最高位很少被用到,所以这个时候我们想到了用二进制的最高位去表示符号位,0代码为正,1代表为负,正好与正负相对应。
于是以前的学者们就把上述的规定叫做原码。 -
原码的弊端
在我们生活中,十进制的每一个正数,都存在着与之对应的负数,它们相加等于0,即它们是相反数。(比如1和-1)。
那么在二进制中,如果用原码表示,我想找到正数0000 0001的相反数,大家理所当然的会想到是1000 0001,这谁想不到呀,这么简单!但是你是否想过,如果让其0000 0001与1000 0001直接相加,其结果是否为二进制0000 0000所表示的0呢?它们相加结果是1000 0010,显然结果不等于0,这有悖于我们的生活中的原理。
2.反码,补码的诞生,为什么定义补码等于反码加一
在上述问题中,二进制原码表示的正数与十进制的正数是很好转换的,那么我们如何根据二进制表示的正数去得到一个对应的负数,让他们相加的结果为0呢?
在用原码表示的8位二进制中,我们都知道1111 1111+0000 0001等于1 0000 0000结果溢出了,计算机在识别的时候只会识别后8位,第9位的1是不会识别出来的,也就是说在8位二进制当中1 0000 0000 与0000 0000 是相等的,其结果也是0。
知道了这个一点之后,我们接下来原码的相反数:
按照我们生活中的思维,
原码+相反数=0000 0000
相反数 = 0000 0000 - 原码
在8位二进制中,把我们得出来的结论 0000 0000与 1 0000 0000相等的结论用上,变成如下式子:
相反数 = 1 0000 0000 - 原码
相反数 = (1111 1111 + 0000 0001 )- 原码
相反数 = 1111 1111 - 原码 + 0000 0001
相反数 = (1111 1111 - 原码 )+ 0000 0001
看到这里我相信大家应该会感觉有点那味了,1111 1111 - 原码 是什么呢,这个不就是每一位都与原码相反的二进制数吗,我们的学者把它称为反码,反码反码,不就是每一位都与原码相反的二进制数吗。(比如原码为0101 0101 的二进制数,带入1111 1111 - 原码 这个式子中得 1111 1111 - 0101 0101 = 1010 1010 ,0101 0101 的反码是 1010 1010)
把刚刚得到的结论带入上式,
相反数 = 反码 + 0000 0001
看到这一步大家是不是觉得更加有那味了,为了不把相反数这个名词与反码弄混淆,我们在二进制中取了一个新的名字补码
用来代替生活中的相反数一词,当然这都是翻译过来的名词。最后我们得到如下表达式:
补码 = 反码 + 0000 0001
补码 = 反码 +1
以上例子是以8位二进制为例来说明的,当然16,32位甚至更高位的二进制数其推理过程与之类似。
目前我们的计算机基本上都是以补码的格式进程存储二进制数,以补码的形式进行运算二进制数,这符合我们的逻辑思维,也加快的计算机的运算速度。
以上是个人的思考,如果有误,还请大牛指出!