



一个数在机器内的表示形式称为“机器数”。机器数是有符号的,通常把这个符号放在二进制数的最高位。计算机内部只有“0”和“1”两种形式,因此在最高位用“0”表示正,“1”表示负,称为“数符”,其余位表示数值。例如,十进制负数-6,其二进制数为-110,在计算机中表示为 10000110,如图 2-1 所示。
图 2-1 机器数
把直接用正号“+”和负号“-”来表示其正负的二进制数叫作机器数的“真值”,即带符号的机器数真正表示的值。例如,机器数“01001”的真值为“+1001”,机器数“11001”的真值为“-1001”。
在计算机中,整数通常使用原码、反码和补码表示。这三种表示方式都是用二进制位表示数字,用 0 表示正,用 1 表示负,其余位表示数值大小,但数值位采用不同的规则来表示。下面,以字长为 8 的整数为例进行介绍。
数值型整数的最高位为符号位,0 表示正数,1 表示负数。 X 的原码可以表示成[ X ] 原 ,例如:
[+1] 原 =00000001 [+127] 原 =01111111
[-1] 原 =10000001 [-127] 原 =11111111
原码在数据计算过程中存在两点不足:
①0 的原码不唯一。0 既可以表示为[+ 0] 原 =0000000,也可以表示为[-0] 原 =1000000。这种情况下,计算机在进行运算时还需要特殊处理。
②符号需要单独处理。加减法需要分别考虑符号位和数值部分,这样计算起来比较烦琐。比如,对于两个符号相同的数据进行相加,数据直接相加,符号不变;两个符号不同的数据进行相加,需要先对它们的绝对值进行比较,才能决定运算结果的符号,否则就会出错。
例如,(-7)+5 的结果应该为-2,但在计算机中,若不考虑符号问题,符号位与数值同时参与运算,则结果为-12,运算过程如下:
结果显然是错误的。由此,出现了反码和补码的编码方式,已解决以上问题。
正数的反码和原码相同;负数的反码补码是符号位为 1,数值位按位取反。通常用[ X ] 反 表示反码,例如:
[+1] 反 =00000001 [+127] 反 =01111111
[-1] 反 =11111110 [-127] 反 =10000000
反码运算并不方便,且仍然存在 0 的原码不唯一的情况。0 既可以表示为[+0] 反 =0000000,也可以表示为[-0] 反 =11111111。因此,反码只作为求补码的中间步骤。
正数的补码和原码相同;负数的补码是符号位为 1,数值位按位取反后加 1。通常用[ X ] 补 表示补码,例如,
[+1] 补 =00000001 [+127] 补 =01111111
[-1] 补 =11111111 [-127] 补 =10000001
在补码表示中,0 的补码表示是唯一的,即:
[+0] 补 =00000000 [-0] 补 =[-0] 反 +1=11111111+1=00000000
采用补码表示,在保证 0 唯一的同时,多出的一个编码 10000000,可以用来表示-128,这样的话,数据的表示范围就扩充为 127~-128。而原码和反码的最小值为-127。
补码表示法是计算机中最常用的表示带符号整数的方式,其优势在于可以用同一种方式进行加减运算,且减法可以转换成加法。下面通过几个实例加以说明:
【 例 1.17 】求(-8)的补码。
[-8] 补 =[-8] 反 +1=11110111+1=11111000
【 例 1.18 】求补码 11110101 对应的原码。
其高位为 1,即为负数,因此高位“1”保持不变,其余位按位取反后为 0001010,然后加 1,结果为 10001011。
【 例 1.19 】完成 7-5 的运算。
7-5 可以表示为 7+(-5):
【 例 1.20 】完成(-7)+(-4)的运算。
高位 1 丢弃(允许产生最高位的进位被丢弃),余下部分 11110101 按照例 1.18 补码求原码的方法进行,求得原码为 10001011,即为-11。
【 例 1.21 】完成 67+84 的运算。
运算结果为负,显然是错误的。原因在于,机器数的表示范围受字长和数据类型的限制,字长和数据类型决定了机器数能表示的数值范围。例如,表示一个整数,字长为 8 位,最高位为符号位,则最大的正数为0111111,即最大值为 127,若数值超出 127,就要“溢出”。因此,要表示一个超过表示范围的数时,通常用浮点数表示。
在计算机中,数值型数据有两种表示方法:一种是定点数,另一种是浮点数。
定点数就是指在计算机中所有数的小数点位置固定不变,分为定点小数和定点整数。
定点小数一般是把小数点固定在最高位(最左)的左边,小数点前边再设一位符号位,因此,它只能表示小于 1 的纯小数;定点整数将小数点固定在最低数据位(最右)的右边,因此,整数所表示的数据的最小单位为 1,表示的也只是纯整数。由此可见,定点数的表示范围很小。
浮点表示法对应于科学(指数)记数法,用以近似表示任意某个实数。具体地说,这个实数由一个整数或定点数(即尾数)乘以基数 R (计算机中通常是 2)的整数次幂得到,这种表示方法类似于基数为 10 的科学记数法。
例如,二进制数 1010.011B可表示为
1010.011=1.010011×2 3 =0.1010011×2 4 =10100.11×2 -1
实数的范围和精度分别用阶码和尾数来表示,其存储格式如图 2-2 所示。
图 2-2 浮点数存储格式
其中:
①阶码是指数,在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫作阶码,用来指示尾数中的小数点应当向左或向右移动的位数。阶码的位数随数值的表示范围而定。
②尾数是纯小数,表示数值的有效数字,其本身的小数点约定在数符和尾数之间。尾数的位数依据数据的精度要求而定。
③阶符和数符各占一位,分别表示阶码和尾数的符号。尾数的数符决定了浮点数的正、负,阶码的阶符决定了小数点的位置。