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

举报
YuShiwen 发表于 2022/03/31 00:34:22 2022/03/31
【摘要】 如何你看到了这篇文章,想必你应该是一个爱思考,善于学习的人! 我们经常说:补码=反码+1,但为什么要这样去定义补码呢?补码,反码被早期计算机学家设计出来的目的是什么呢? 下面我们就对上面的问题进行详细解答...

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

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

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

文章来源: blog.csdn.net,作者:Mr.Yushiwen,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/MrYushiwen/article/details/108064781

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。