为什么计算机采用补码形式进行数据的表示、存储及计算?

                                  为什么计算机采用补码形式进行数据的表示、存储及计算?
                                                                                                                                     作者:天涯过客

      本文主要针对“为什么计算机只用补码形式进行计算”这一问题进行探讨,根据自己的理解给刚接触java领域的萌新带来一点启发和灵感。至于涉及到别的一些概念,作者会用最通俗易懂的解释一笔带过,如果想要最科学官方的定义,请自行百度。
      要理解这个问题,必须提到另外两个概念:原码和反码。我们都知道,计算机中所有的数据都是通过二进制进行存储和计算的,说白了,无论你给电脑输入什么样的数据,文字也好,图片也好,计算公式也好,计算机都是不认识的,它们都会把所输入的数据转化为二进制数据,因为它们只认得“0”和“1”,比如100001、101010101、111100110啥的。并且,计算机有一个软肋,那就是它不会做减法计算。但是,它可以将减法计算式转化为加法计算式,例如,1-1会被转化为1+(-1)。可是,计算机是怎么区分正负数的呢?这就涉及到原码的概念了。这里引用一下百度百科所解释原码的概念:“原码是一种计算机中对数字的二进制定点表示方法,原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。”举个以一个字节(byte)八个二进制位的例子,正数+1原码就是00000001,那么负数(-1)的原码就是10000001。其差别就在于最高位数字,一个是0,一个是1,其它各个部位的数字均是一样的。但是有人会问:为什么用计算器算出来10000001的十进制答案是正数呢?因为那是无符号类型数据,最高位的数字仅仅是数字而已,不代表正负号,而在Java中数据只有有符号位类型。但是像其它语言,例如c语言中的数据是存在无符号类型的。回归正题,那么为什么计算机中不采用原码进行数据计算,而是采用补码呢?
   这个时候,需要举例子来为大家解释了。见下图:在这里插入图片描述
我们以正负七为例:在数学中,7+(-7)=0。可是我们把7和-7各自换算成原码分别为:00000111、10000111。这时候我们将两个原码相加,得到的数字为10001110,可是这个数字换算成十进制却不是0了。因此,用原码进行数据计算是不准确的。那怎么样才能让十进制的数字换算成二进制后以然能够计算准确呢?这时候,就提到了补码的概念。补码是从反码转化而来,而反码是从原码转化而来(原码——>反码——>补码),在我的理解里,反码就是为了转化成补码而存在的(当然有其存在的合理性和必要性,但我是这样理解的)。仔细观察上图,先记住一点,那就是:正整数的原码,反码和补码都一样。关键在于负整数的原反补。负数的反码是保留了其原码的符号位,其它所有数位全部取反,也就是0变为1,1变为零。例如,-7的原码为10000111,保留最高位,取反其它位,就是它的反码:11111000。而-7的补码也就是在反码的基础上加1,变为11111001。综合起来,我们可以认为,负整数的补码就是在其原码的基础上,保留最高位,取反其它位,再加1。那么,为什么这么做,就能保证补码之间的计算是准确的呢?这也是文章标题的关键所在。要理解这个问题,我们必须要知道正数的补码和负数补码之间有着怎样的联系。既然补码是由原码转化而来的,那么我们可以先弄清楚,-7的原码和+7的补码有着怎么样的联系。前面已经让大家记住了:正整数的原码,反码和补码都一样。既然-7和+7的原码差别只在于最高位一个是0,一个是1,那么可以推算为-7的原码和+7的补码差别也只是最高位的差别,别的数位都是一样。不懂的可以仔细看图。这个时候关键来了,我们对-7的原码进行反码转化,最高位保留,也就是继续保留着和+7补码最高位的互补,而其它位全部取反,那么,原本和+7补码其它位完全一样的数字都变为互相互补了(仔细对照图片)。可以发现,包括符号位在内的所有数字,+7的补码和-7的反码完全互补。这个时候,两数相加结果为11111111。别忘了,反码换算成补码是需要加1的,也就是在11111111的基础上加1,结果为100000000。而我们用到的是八位二进制位,因此从右往左数第八位是零,左边的1被排除掉了,结果应该是00000000。这个时候,换算成十进制也是零,计算无误。这就是为什么计算机要采用补码形式进行计算,目的就是为了和保证和十进制的计算保持同步。

猜你喜欢

转载自blog.csdn.net/weixin_44734925/article/details/88432355