先来弄清楚3个概念。
原码
原码是指一个二进制数左边加上符号位后所得到的码,且当二进制数大于0时,符号位为0;二进制数小于时,符号位为1;二进制数等于时,符号位可以为或1(+0/-0)。
计算机中所有的数均用0、1编码表示,数字的正负号也不例外,如果一个机器数字长是n位的话,约定最左边一位用作符号位,其余n-1位用于表示数值。
小数原码的定义
例如:[+0.1011]原=0.1011000
[-0.1011]原=1.1011000
整数原码的定义
反码
反码是一种在计算机中数字的机器码表示。对于单个数值(二进制的0和1)而言,对其进行取反操作就是将0变为1,1变为0。也就是说,若,则反码为;若,则反码。数值上面的一横表示反码的意思。
反码也称为一的补码(英语:ones' complement),其表示方法如下
式中,N为真值,n为编码的位数。
显然,正数的反码等于其原码,而负数的反码则可以通过保留其符号位,将原码的数值位取反得到。
补码
补码是一种用二进制表示有符号数的方法。
正数和0的补码就是该数字本身。
负数的补码则是将其对应正数按位取反再加1。
补码系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路及补码电路即可完成各种有号数加法及减法,在电路设计上相当方便。
另外,补码系统的0就只有一个表示方式,这和反码系统不同(在反码系统中,0有二种表示方式),因此在判断数字是否为0时,只要比较一次即可。
下图是一些8-bit补码系统的整数。它的可表示的范围包括-128到127,总共256(=28)个整数。
计算机里面的运算都是靠加法器来完成的。加法器只能做加法。即使是减法。它也是将其转换成加法来运算的。
依据我们上面的定义:如果是都采用源码来运算,参看下面的代码
上图是都采用源码进行的计算。发现计算的结果是-20。明显是不对的。
正因为这样。所以计算机引入了反码和补码的概念。
原码 1000 0101 (-5)
---------------------------
反码 1111 1010
---------------------------
+1
---------------------------
补码 1111 1011
---------------------------
下面我们让-5的补码来参与运算。如下图:
现在的结果就是我们所希望了。
领取专属 10元无门槛券
私享最新 技术干货