前面介绍的是正数的表示方法。但是,在日常的计算过程中,计算机也会大量地遇到负数的情况。例如,对于一个减法运算,如5-3,我们可以重写成5+(-3)。这样,减法运算就变成了加法运算。
在数字系统中,用于执行算术功能的部件经常需要处理负数。所以,必须要定义一种表示负数的方法。一个 N 位的系统总共可以表示2 N 个数,因此一个有用的编码方案就是使用一半可用的编码(2 N /2)表示正数,另一半表示负数。可以将一个比特位作为一个符号位,用于区分正数和负数。在这种表示方法中,最高有效位(Most Significant
Bit,MSB)可以作为符号位。如果:
(1)符号位为“1”,所表示的数为负数;
(2)符号位为“0”,所表示的数为正数。
在所有可能的负数编码方案中,经常使用两种编码方案,即符号幅度和二进制补码。
符号幅度表示法,就是简单地用MSB表示符号位,剩下的位表示幅度,如图4.1(a)所示。在一个8位的符号幅度系统中,十进制正整数16用二进制数表示为“00010000”,而十进制负整数-16用二进制数表示为“10010000”,这种表示方法很容易理解。
但是,用于数字系统中最不利的方面表现在:
(1)最大的正数将出现在所表示范围一半的地方,后面紧跟着最大的负数,如图4.1(a)所示;
(2)最小的负数出现在二进制数可表示范围的末尾,如图4.1(a)所示。很明显在最大的负数后面,由于位数的原因,二进制数将回卷到最小的正数0。
因此,一个更好的表示方法应该将最小的正数和最大的负数放在相邻的位置。
由于上面的原因,引入二进制补码的概念,如图4.1(b)所示。
图4.1 8位负数的两种不同表示
在二进制补码编码中,MSB仍是符号位,“1”表示负数,“0”表示正数。在二进制补码中,0由一个包含所有0的比特模式所定义。其余的2 N -1个数表示非零的正数和负数。由于2 N -1是奇数,(2 N -1)/2个编码表示负数,[(2 N -1)/2]-1个编码表示正数。换句话说,可以表示的负数比正数多一个。最大负数的幅度要比最大正数的幅度个数多一个。
二进制补码编码的不利地方是,不容易理解负数。对于一个N为字长的二进制补码来说,其可以表示的有符号数(包括正数、负数和0)的范围是:-2 N-1 ~2 N-1 -1
思考与练习4-3:当数据的宽度为8位时,用符号幅度表示法表示下面的负数。
(1)-127=____________________。
(2)-1=______________________。