4.4 负数表示方法
前面介绍的是正数的表示方法。但是,在日常的计算过程中,计算机也会大量地遇到负数的情况。例如:对于5-3的减法运算,可以写成5+(-3)。这样,减法运算就变成了加法运算。但是,正数变成了负数。
在数字系统中,用于执行算术运算功能的部件经常需要处理负数。所以,必须要定义一种表示负数的方法。一个字长为N位的二进制系统(如计算机)总共可以表示2N个十进制整数,可以使用2N/2个二进制数表示十进制的非负整数(包括零和正整数),使用2N/2个二进制数表示十进制的负整数。在实际的数字系统(如计算机)中,将N位字长的二进制数中的一个比特位用作一个符号位,以区分正数和负数。通常,将N位字长二进制数的最高有效位(Most Significant Bit,MSB)作为符号位。当MSB取值为1时,该二进制数表示十进制的负数;当MSB取值为0时,该二进制数表示十进制的正数。
在所有可能的负数二进制编码方案中,经常使用符号幅度表示法和二进制补码表示法。
4.4.1 符号幅度表示法
当采用符号幅度表示法时,N位字长二进制数的MSB表示符号位,剩下的N-1位表示幅度,如图4.1(a)所示。对于一个字长为8位的二进制数来说,当采用符号幅度表示法时,十进制的正整数16用二进制数表示为00010000,而十进制的负整数-16用二进制数表示为10010000。这种表示方法,比较直观并且很容易理解。
图4.1 8位负整数的两种不同表示法
但是,符号幅度表示法用在数字系统中表示负数时,最不利的方面体现在:
(1)最大的正整数将出现在二进制数所表示范围近一半的地方,后面紧跟着负零,然后是最大的负整数,如图4.1(a)所示。
(2)最小的负整数出现在二进制数可表示范围的末尾,如图4.1(a)所示。很明显,在最小的十进制负整数(-127)后面,由于二进制数位宽(字长)的限制,最小的十进制负整数-127(二进制表示为11111111)将回卷到正零(二进制表示为00000000)。由于从最小的十进制负整数-127将跳变到正零,出现了表示数的不连续问题。
(3)在幅度符号表示法中,二进制数00000000表示为正零(符号位为0表示正数),10000000表示为负零(符号位为1表示负数)。因此,出现了对零这个整数的两种不同表示方法。
因此,一个更好的负整数表示方法应该将最大的负整数、零和最小的正整数放在相邻的位置,即数的表示应具有连续性,并且消除对零的两种不同表示方法。
4.4.2 补码表示法
由于符号幅度表示法存在明显的缺陷,因此引入了二进制补码表示法,如图4.1(b)所示。在采用二进制补码表示法时,MSB仍是符号位,MSB取值为1表示负数,MSB取值为0表示正数。在这种表示法中,整数0只由一个N位字长的全零二进制数表示,因此消除了在幅度符号表示法中对整数0的两种不同表示方法。在补码表示法中,除了零以外,其余的2N-1个数表示正整数和负整数。由于2N-1是奇数,而个二进制数表示十进制数中的负整数,其余的个二进制数表示十进制数中的正整数。换句话说,可以表示的十进制负整数比可以表示的十进制正整数要多一个数。在该例子中,由于使用8位字长的二进制数表示十进制整数,因此可以表示的十进制负整数范围是-128~-1,可以表示的十进制正整数的范围是+1~+127,此外还包含一个十进制整数0。
采用二进制补码表示负数唯一的缺点就是不直观,但是消除了符号幅度表示法所存在的所有缺陷。因此,在实际的数字系统中通常采用二进制补码来表示负数。对于一个字长为N位的二进制数来说,其可以表示的十进制整数的范围是:-2N-1~2N-1-1。