1.5.1 数值信息的表示
1.数的定点和浮点表示
在计算机中,一个带小数点的数据通常有两种表示方法:定点表示法和浮点表示法。在计算过程中小数点位置固定的数据称为定点数,小数点位置浮动的数据称为浮点数。
计算机中常用的定点数有两种,即定点纯整数和定点纯小数。将小数点固定在数的最低位之后,就是定点纯整数。将小数点固定在符号位之后、最高数值位之前,就是定点纯小数。
我们知道一个十进制数可以表示成一个纯小数与一个以10为底的整数次幂的乘积,如135.45可表示为0.13545×103。同理,一个任意二进制数N可以表示为下式:
其中,S称为尾数,是二进制纯小数,表示N的有效数位;J称为N的阶码,是二进制整数,指明了小数点的实际位置,改变J的值也就改变了数N的小数点的位置。该式也就是数的浮点表示形式,而其中的尾数和阶码分别是定点纯小数和定点纯整数。例如,二进制数11101.11的浮点数表示形式可为:0.1110111×25。
2.数的编码表示
一般的数都有正负之分,计算机只能记忆0和1,为了将数在计算机中存放和处理就要将数的符号进行编码。基本方法是在数中增加一位符号位(一般将其安排在数的最高位之前),并用“0”表示数的正号,用“1”表示数的负号,例如:
数+1110011在计算机中可存为01110011;
数-1110011在计算机中可存为11110011。
这种数值位部分不变,仅用0和1表示其符号得到的数的编码,称为原码,并将原来的数称为真值,将其编码形式称为机器数。
按上述原码的定义和编码方法,数0就有两种编码形式:0000…0和100…0。所以对于带符号的整数来说,n位二进制原码表示的数值范围是:
例如,8位原码的表示范围为:-127~+127,16位原码的表示范围为-32767~+32767。
用原码作乘法,计算机的控制较为简单,两符号位单独相乘就得结果的符号位,数值部分相乘就得结果的数值。但用其作加减法就较为困难,主要难在结果符号的判定,并且实际进行加法还是进行减法操作还要依据操作对象具体判定。为了简化运算操作,把加法和减法统一起来以简化运算器的设计,计算机中也用到了其他的编码形式,主要有补码和反码。
为了说明补码的原理,先介绍数学中的“同余”概念,即对于a、b两个数,若用一个正整数K去除,所得的余数相同,则称a、b对于模K是同余的(或称互补)。就是说,a和b在模K的意义下相等,记作a=b(MOD K)。
例如,a=13,b=25,K=12,用K去除a和b余数都是1,记作13=25(MOD12)。
实际上,在时针钟表校对时间时若顺时针方向拨7h与反时针方向拨5h小时其效果是相同的,即加7和减5是一样的。就是因为在表盘上只有12个计数状态,即其模为12,则7=-5(MOD12)。
对于计算机,其运算器的位数(字长)总是有限的,即它也有“模”的存在,可以利用“补数”实现加减法之间的相互转换。下面仅给出求补码和反码的算法和应用举例。
(1)求反码的算法。
对于正数,其反码和原码同形;对于负数,则将其原码的符号位保持不变,而将其他位按位求反(即将0换为1,将1换为0)。
(2)求补码的算法。
对于正数,其补码和原码同形;对于负数,先求其反码,再在最低位加“1”(称为末位加1)。
求原码、反码和补码的计算,举例如表1.1所示(以8位代码为例)。
若对一补码再次求补就又得到了对应的原码。
表1.1 真值、原码、反码、补码对照举例
说明:在二进制数的小数取舍中,0舍1入。(0.82)10=(0.110100011…)2,取8位小数,就把第9位上的1入到第8位,而第8位进位,从而得到十进制0.82的二进制数是0.11010010。在原码中,为了凑8位数字,把最后一个0舍去。-0.6的转换类似。
3.补码运算举例
补码运算的基本规则是[X]补+[Y]补=[X+Y]补,由此规律进行计算。
(1)18-13=5。
由式18-13=18+(-13),则8位补码计算的竖式如下:
最高位进位自动丢失后,结果的符号位为0,即为正数,补码原码同形。转换为十进制数即为+5,运算结果正确。
(2)25-36=-11。
由式25-36=25+(-36),则8位补码计算的竖式如下:
结果的符号位为1,即为负数。由于负数的补码原码不同形,所以先将其再求补得到其原码10001011,再转换为十进制数即为-11,运算结果正确。
4.计算机中数的浮点表示
前面已经提到数的浮点表示形式,即阶码和尾数的表示形式。原则上讲,阶码和尾数都可以任意选用原码、补码或反码,这里仅简单举例说明采用补码表示的定点纯整数表示阶码、采用补码表示的定点纯小数表示尾数的浮点数表示方法。例如,在IBM PC系列微机中,采用4个字节存放一个实型数据,其中阶码占1个字节,尾数占3个字节。阶码的符号(简称阶符)和数值的符号(简称数符)各占一位,且阶码和尾数均为补码形式。当存放十进制数+256.8125时,其浮点格式为
即(256.8125)10=(0.1000000001101×21001)2。
当存放十进制数据-0.21875时,其浮点格式为:
即(-0.21875)10=(-0.00111)2=(-0.111×2-010)2。
由上例可以看到,当写一个编码时必须按规定写足位数,必要时可补写0或1。另外,为了充分利用编码表示高的数据精度,计算机中采用了“规格化”的浮点数的概念,即尾数小数点的后一位必须是非“0”,即对正数小数点的后一位必须是“1”;对负数补码,小数点的后一位必须是“0”。否则就左移一次尾数,阶码减一,直到符合规格化要求。