为什么定义补码等于反码加一,知其所以然

简介: 为什么定义补码等于反码加一,知其所以然

如何你看到了这篇文章,想必你应该是一个爱思考,善于学习的人!
我们经常说:补码=反码+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位甚至更高位的二进制数其推理过程与之类似。

目前我们的计算机基本上都是以补码的格式进程存储二进制数,以补码的形式进行运算二进制数,这符合我们的逻辑思维,也加快的计算机的运算速度。

以上是个人的思考,如果有误,还请大牛指出!

目录
相关文章
|
1月前
|
Java 开发者
【编程基础知识】2的n次幂与二进制位全为1之间的联系,为啥只差一个1
本文深入探讨了2的n次幂与二进制位全为1之间的数学联系,解释了2的n次幂减一的二进制表示为何全为1,并探讨了这一特性在HashMap中的应用。通过基础数学原理和实际代码示例,文章揭示了这一特性的实用价值,适合各水平的编程爱好者学习。
19 3
|
1月前
【编程基础知识】正数负数的二进制位运算(左移 右移 无符号右移)
正数和负数需转换成二进制后进行移位运算。左移低位补0,不影响符号位;右移符号位跟随移动,最高位还原为原符号位;无符号右移高位补0,适用于负数处理。
73 0
|
6月前
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
|
C语言
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
247 0
数字逻辑基础:原码、反码、补码
数字逻辑基础:原码、反码、补码
180 0
|
存储
5.3.1_原补码的乘法运算
计算机组成原理之原补码的乘法运算
353 2
5.3.1_原补码的乘法运算
|
算法
剑指Offer - 面试题16:数值的整数次方
剑指Offer - 面试题16:数值的整数次方
55 0
|
C语言 Python
左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?
左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?
|
人工智能 算法 C++
【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
|
存储
5.3.2_原补码的除法运算
计算机组成原理之原补码的除法运算
326 0
5.3.2_原补码的除法运算