1.3.2 有符号二进制数的表示
前面只考虑了无符号二进制数,当算术运算涉及正、负数时,就需要用有符号的二进制数。在日常生活中,我们通常在一个数的前面用“+”表示正数,用“−”表示负数。但数字系统只能识别0和1,那么,在数字系统中如何表示正、负数呢?
数字系统中通常正、负号也用0和1来表示,即将数的符号数值化,如图1.3.1所示。左边的最高位为符号位(通常用0表示“+”,用1 表示“−”),其余位为数值位。根据数值位的编码方式,有符号数又分为原码、反码和补码等不同的表示方法,其中补码是数字系统中使用最多的一种编码。下面分别进行介绍。
图1.3.1 有符号整数的表示方法
1.原码
在原码表示中,数值用其绝对值的二进制数形式表示。这种表示方法又称为符号—数值(Sign-Magnitude)表示法。例如:
X1=+105=+(110 1001)B,(X1)原=(0110 1001)B
X2=-105=-(110 1001)B,(X2)原=(1110 1001)B
可见,用原码表示时,+105和−105的数值位相同,而符号位相反。
数0有两种不同的原码表示:
(+0)原= (0000 0000)B,(-0)原= (1000 0000)B
原码表示简单易懂,而且转换为十进制数很方便,实现加、减运算却比较麻烦。例如,两个同符号数进行减法运算时,需要根据两数的大小确定被减数和减数,以及运算结果的符号。为了简化运算器的结构,把减法运算转换为加法运算,补码的概念被引入。补码与反码之间有一定的运算关系,我们先介绍反码。
2.反码
国外教材常将反码称为“1的补码”(1's Complement)。在反码表示中,正数的反码和原码相同,而负数反码的符号位为1,数值位为其绝对值按位取反(即将1翻转成0,将0翻转成1)。例如:
X1=+105=+(110 1001)B,(X1)反=(0110 1001)B
X2=-105=-(110 1001)B,(X2)反=(1001 0110)B
可见,正数的反码和原码相同。
数0也有两种不同的反码表示:
(+0)反= (0000 0000)B,(-0)反= (1111 1111)B
3.补码
国外教材常将补码称为“2的补码”(2's Complement),也称为“基数补码”。在补码表示中,正数的补码和原码相同,而负数补码的符号位为1,数值位为其绝对值按位取反,并在最低位加1。或者说,负数的补码为其反码加1。例如:
X1=+105=+(110 1001)B,(X1)补=(0110 1001)B
X2=-105=-(110 1001)B,(X2)补=(1001 0111)B
二进制数的补码
补码解决了原码和反码中数0的编码不唯一的问题。0的补码表示是唯一的,即(+0)补=(-0)补= (0000 0000)B。
求负数补码的另一种简便方法:先求出负数的原码,再从右边的最低位向左边的最高位扫描,保留直到第一个“1”的所有位不变,之后数值位的各位按位取反,保留符号位不变。
例1.3.5 求-90的8位二进制补码。
解 +90的原码为(0101 1010)B,将最高位即符号位改为1,得到-90的原码:(1101 1010)B。
再求-90的补码。从右向左扫描,保留右边的两位(10)不变,对其左边的数值位按位取反,并保留符号位不变。最后结果为
(-90)补= (1010 0110)B
如果按照前面的方法,求出(-90)反= (1010 0101)B,反码加1就得到补码,即(-90)补=(1010 0110)B,可见,结果相同。
例1.3.6 求-1的8位二进制补码,然后对-1的补码再次求补。
解 因为(-1)原= (1000 0001)B,使用从右向左扫描的方法,保留最低位的1不变,对其左边的数值位按位取反,并保留符号位不变。得到:
(-1)补= (1111 1111)B
((-1)补)补= (1111 1111)补= (1000 0001)B= (-1)原
可见,对一个整数的补码再次求补,得到该整数的原码。
4位有符号二进制数的原码、反码和补码对照表如表1.3.1所示。对于-0和+0,原码和反码是不同的4位二进制数,而补码则是相同的。因此,它们表示的数值范围分别为原码-7~+7、反码-7~+7、补码-8~+7。
一般来说,n位有符号二进制数的原码、反码和补码都有一位用来表示符号,剩余的(n - 1)位表示数值。因此,它们表示的数值范围分别为
原码 -(2n-1- 1)~ + (2n-1- 1)
反码 -(2n-1- 1)~ + (2n-1- 1)
补码 -2n-1~ + (2n-1- 1)
表1.3.1 4位有符号二进制数原码、反码、补码对照表