首页 > 技术文章 > 关于原码,反码,补码的简单认识

YXSZ 2018-10-04 10:59 原文

  首先我们都明白,计算机是只能运行数字的。其次,为了方便,计算机只能运行二进制的数字,也就是说,计算机只能识别带有0、1的数字。而人们日常用的是十进制的数字,所以,为了和计算机进行沟通,必须将我们下达给计算机的命令全部转化为二进制的数字,这样计算机才会正常执行命令。由此,原码,反码,补码的概念出现了。

(1)原码

  原码规则:符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

  说到数字,不得不提的一点就是数字有正(+)负(-)之分,而计算机却不能识别正负号,所以人们规定,计算机字长为8位,第一位是符号位, 0就代表正数,1代表负数。其余7位用来储存数据。

  比如2,原码为00000010;-2,原码为10000010。而此时,问题就又出来了,2 - 2 = ?这是非常“白痴”的一个问题,答案当然是0了。但如果让计算机去做呢?

  计算机会这么想:因为2 - 2 = 2 + (-2),又因为2 = 00000010且-2 = 10000010,所以,2 + (-2) = 00000010 + 10000010 = 10000100 = -3。于是,计算机就将 -3输出在显示屏上了。

  答案对吗?废话,当然是错的了。而仔细分析计算机的计算过程,你就会发现,计算机错就错在符号问题上,因为用了首位去代替符号,所以用原码计算的数值就是错误的。怎样解决这个问题呢?反码诞生了。

(2)反码

  反码规则:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

  还是刚才那道题:2 - 2 = ?

  为了解决这道题,我们将反码的规则交给计算机,于是,计算机就会这样思考这道题了:因为2 - 2 = 2 + (-2),又因为2(原) = 00000010

且-2(原) = 10000010,又因为,2(反) = 00000010且 -2(反)= 11111101,所以 2 + (-2)= 2(反)+(-2)(反)= 00000010 + 11111101 = 11111111

所以转换成原码得到-0。于是,显示屏这次显示的答案:-0。

  0是正确答案,那-0是怎么回事?众所周知,符号对于0是没有意义的,也就是说,不管 +0还是 -0都是0。但问题是死板的计算机不知道啊,它只会输出它计算后得到的数字。所以这道简单的小学计算题计算机又算错了。怎样让计算机算对这道小学计算题呢?我们将补码的执行规则交给了计算机。

(3)补码

  补码规则:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)

  继续执行 2 - 2 = ?的问题。

  这次计算机该怎样思考呢?它会这么想:因为2 - 2 = 2 + (-2),又因为2(原) = 00000010且-2(原) = 10000010,又因为,2(反) = 00000010且 -2(反)= 11111101,又因为,2(补)= 00000010且 -2(补)= 11111110,所以 2 + (-2)= 2(补)+(-2)(补)= 00000010 + 11111110 = 100000000

咦,得到一个九位数,数据溢出了,那就得到00000000。所以,显示屏这次显示了正确答案:0。我们的计算机总算是做对了一道小学计算题。

  总结

  原码的优点是转换方便,与我们所用的十进制数字联系较为紧密,便于使用。而反码就像是原码的补丁,用来解决原码不能计算加减运算的弊端。补码就是反码的补丁,用来解决反码中+0和-0的不统一问题。而由于补码的全能型,计算机储存数据时全部都是用补码储存的。所以,原码,反码和补码是计算机中必不可少的数据功能。

 

推荐阅读