1.1.4 计算机表示数字的方法
计算机能识别的数只有二进制数,所以在计算机中均是用二进制表示数和进行数的存储及运算。数有定点整数和浮点数,有正数,还有负数。计算机中所使用的二进制数的长度与数的大小和范围有关系。
1.机器数与真值
数值本身大小称为数的真值,如-1CH的真值为-0011100,+63H的真值为+1100011。显然“+”号和“-”号是人为添加的用于识别数的符号的标记,计算机无法识别这些标记。为了能够让计算机识别数的符号,通常在数值中设定一位符号位,且约定符号位为数的最高位。以8位二进制为例,通常将D7位设为数的符号位S,S=0表示正数,S=1表示负数,带上符号位S的数就称为该数的机器数。
所以-1CH的机器数为10011100B(9CH),+63H的机器数为011000011B(63H)。
2.数的原码、反码与补码
计算机中可以用三种码表示数,即原码、反码、补码。
(1)原码
原码与机器数相同,最高位为符号位,设有一数X,其原码记为[X]原。以8位数为例,-12H,+36H的原码分别为10010010B和00110110B,表示成
[10010010]原 [00110110]原
在原码表示法中,0有两个原码:
[+0]原=00000000 [-0]原=10000000
(2)反码
反码是数的另一种表示方法,在原码基础上保持最高位符号位不变,将其余位逐位取反即可。设有一数X,其反码记为[X]反,以8位数为例
X=-12H,[X]原=10010010,[X]反=11101101
X=+0,[X]原=00000000,[X]反=00000000
X=-0,[X]原=10000000,[X]反=11111111
需要特别注意的是,正数的反码与原码相同,反码只对负数有效。
(3)补码
补码是数的又一种表示方法,求一个数的补码是在其反码的最低位加上“1”并舍去进位位即可。一个数X的补码表示成[X]补。如-12H,其补码为
[X]补=[[X]原]反+1=[11101101]+1=11101110B(EEH)
[+0]补=00000000
[-0]补=11111111+1=00000000(由于受设备字长的限制,最后的进位丢失)。
可见,正数其原码、反码、补码均相同,负数原码、反码、补码是不同的,且可以互相转换。
3.数的补码运算
用补码进行数的运算比较简单,补码运算的几个重要公式如下:
[-X2]补为[X2]原连同符号位一起逐位取反加“1”获得。
【例1-9】求X1+X2,X1=+0011101B=+29,X2=0000110B=-6。
解:[X1]补=00001110B,[X2]补=11111010B
[X1]补+[X2]补为
其中,“”为机器字长所限被自动舍去的进位值,运算结果为00010111,真值为+23。
(1)补码不能直观表示数的大小,再次求补后可还原得到其原码即机器数;
(2)用补码参与运算可以使得运算变得简单,公式1-3说明采用补码运算后减法可以使用加法实现。
4.机器数字长
机器数的字长与表示数的大小和范围有关系。计算机的字长取决于CPU存储数和参与运算的数长度,如8位字长的CPU,说明其进行存取数操作和参与运算的数的机器数长度均为8bit。典型的机器数字长与数的范围如表1-1所示。
表1-1 机器数长与表示数范围之间的关系
在实际中,如果字长不足以表示数的范围,可以用增加字长的方式拓展数的范围。如用一个字节最大只能表示255,用两个字节则可以表示65535。
5.定点数与浮点数
定点数是指小数点位置固定的数,由于小数点的具体位置不定,因此定点数的格式有很多种。小数点固定在最右边即只有整数没有小数的定点数是定点数的一种特例,是比较常见的定点数表示方法,这种数由于只有整数部分,没有小数部分,使用方便、计算简单,应用于计算机可以降低其制造成本。但是由于没有小数部分,故表示精度有限,但能表示很大范围的数,在一般的微型计算机中经常使用。
为了兼顾数的范围和精度,可以使用浮点数。为了便于使用,国际上制定了浮点数的表示格式,IEEE 754标准规定浮点数格式有单精度、双精度、扩展精度这三种。以单精度浮点数为例,用4个字节(32bit)表示一个带符号的浮点数,具体表示形式如下:
符号位s取0表示正数,取1表示负数。阶码P是8位,阶码为指数与127(0x7f)相加得到。尾数域b有24位,其中b0位隐藏,始终固定为1,在计算机中不明确表示出来,故实际能见的为23位,小数隐藏。
【例1-10】将十进制数178.125表示成单精度浮点数。
解:将178.125表示成二进制实数:178.125=101110010.001B
将二进制实数表示成规格化形式101110010.001=1.01110010001×27
S=0 P=7+127=134=10000110B
b=01100100010000000000000
故178.125按单精度浮点数规格化后为
0 10000110 01100100010000000000000B
【例1-11】求单精度浮点数0 01111110 10110000000000000000000B所表示的十进制数是多少?
解:S=0,说明为正数
P=0 1111110B-127=126-127=-1
格化的尾数b=+1.1011
所以该浮点数所表示的十进制数为+1.1011×2-1=0.84375