在二进制系统中,整数可以分为两种类型,即无符号整数和有符号整数。无符号整数只包含正整数和零,而有符号整数还包含负整数。无符号整数和二进制数之间存在直接的一一对应的关系。但是,对于有符号整数而言,需要将负数转换为二进制补码形式。
在数学中,任意基数的负数都在最前面加上“-”符号来表示。然而,在计算机硬件中,数字都以无符号的二进制形式表示。因此,需要一种编码方式用于表示负数。目前,常用来表示有符号数的3种编码包括原码、反码和补码。
为了解决数字符号表示的问题,首要的处理方法是分配一个符号位来表示这个符号。通常,最高有效位用于表示符号。当该位为0时,表示一个正数;而当该位为1时,表示一个负数。其他位用于表示数值大小(也称为绝对值)。因此,一个字节只有7位用于表示数值大小,最高位用于表示符号位,其表示数值的范围为0000000(0 10 )~1111111(127 10 )。
这样,当增加一个符号位(第8位)后,可以表示(-127) 10 ~(+127) 10 的数值。这种表示数值的方法所导致的结果就是有两种方式用于表示数值0,即00000000,表示+0;10000000,表示-0。十进制数(-43) 10 用8位二进制原码可以表示为10101011。有符号整数和无符号整数的二进制原码表示如表3.1所示。
表3.1 有符号数和无符号数的二进制原码表示
续表
可使用二进制反码描述正数和负数。对于正数而言,与原码形式一样,无须取反。而对于一个负二进制数而言,其反码形式为除符号位以外,对原码的其他位按位取反。同原码表示一样,0的反码表示形式也有两种:00000000(+0)与11111111(-0)。
例如,原码10101011(-43 10 )的反码形式为11010100(-43 10 )。有符号数用反码表示的范围为-(2 N-1 -1)~(2 N-1 -1),以及+0和-0。对于8位二进制数而言,用反码表示时,其表示数的范围为(-127) 10 ~(+127) 10 ,以及00000000(+0)或者11111111(-0),如表3.2所示。
表3.2 无符号整数和有符号整数的反码表示
补码解决了数值0有多种表示的问题,以及循环进位的需要。在补码表示中,负数表示为所对应正数的反码加1。在补码表示中,只有一个0(00000000)。二进制补码的表示方法如表3.3所示。
表3.3 二进制补码的表示
注 :用二进制补码可以表示-128,但不能表示+128。在对正值取反时,会发现需要用第9位表示负零。然而,如果简单地忽略这个第9位,那么这个负零与正零的表示将完全相同。
例如,对于(-97) 10 而言,假设字长为8位,其所对应的二进制补码为(10011111) 2 ,如表3.4所示。
表3.4 (-97) 10 的二进制补码表示
对于一个N位字长的二进制补码而言,它可以表示的范围为