亚里士多德说:“今天十进制的广泛采用,只不过是我们绝大多数人生来具有10个手指头这个解剖学事实的结果。”然而,数在计算机中确是以二制形式表示的,因为计算机是用数字电路搭成的,数字电路中只有1和0两种状态,也就是说计算机只有两个手指头,所以对计算机来说二进制(Binary)是最自然的计数方式。

       实事上,数在计算机中不仅仅是以二进制形式表示,而且是以二进制的补码形式表示的,何为补码?为什么要用补码?下面从数计算机表示形式说起。
数分为有符号数和无符号数,对于有符号数,它有三种表示形式:原码、反码和补码。在它的二进制原码中,用最高位表示符号位,如果最高位为0,表示该数为正数,最高位为1则表示为负数。比如00000001是1的原码,而10000001则是-1的原码。

       因为人为的把一个数字的原码最高位定义为符号位,而计算机在运算的过程中,如果用原码计算,可能并不能正确的识别,比如假设字长为8bits 要完成,1-1 =0的运算时,计算运算过程如下:

( 1 ) - ( 1 )

= ( 1 ) + ( -1 )

= (00000001)+ (10000001) -------原码计算

= (10000010)= ( -2 )

这结果显然不正确,不正确的原因就是因为-1的高位符号位被当做普通数位参与运算了。

       为了让符号位一起参与计算而不出现错误,引进反码和补码的概念:原于正数而言,它的反码与补码跟原码相同,对于负数而言,它的补码是在原码的基础上保持符号位不变,而其它各位取反得到反码,补码则被定义成它的补码加1即:

正数:

       原码=反码=补码
负数:

       反码=其原码除符号位之外的各位求反

       补码=反码+1  (如果+1之后有进位的,要一直往前进位,包括符号位)

补码有以下几个特性:

1.补码本身具有幂等性:该特性决定我们虽然运算使用补码,但是通过两次补码可以回到原码;
  ((X)补)补=X
   a+b=(a补+b补)补

2.补码解决了正0 0的二义性,使0的表示得到统一
  正零:00000000
  负零:10000000
  这两个数其实都是0,但他们的原码却有不同的表示。
  但是他们的补码是一样的,都是00000000

3.CPU将加,减法统一为加法运算
  [a-b]补=a补+(-b)补

4.使符号位能与有效值部分一起参加运算,从而简化运算规则。

5.补码使二进制的加、减、移位等操作和十进制具有相同的运算规律;

6.负数-a实际上使用0-a结果,通过二进制运算0-a就是-a的补码,由此可见定义补码就是要求所有算术运算符合现有的运算规律

       正因为如此,计算机底层都是采用补码进行计算的。

上文中粗体字体或红色字体的内容为重点了解或者记忆的内容,更多信息,请用微信扫码关注本人公众号

重温计算机二进制补码-LMLPHP

04-04 00:33