计算机中数的表示方法有定点格式与浮点格式两种。 一般来说, 定点格式允许的数值范围 有限,但处理定点数的硬件比较简单,而浮点格式表示的数的范围较大,但要求的硬件比较复 杂。为了清楚阐述计算机中数的表示方法,首先认识计算机中有关数的三个概念,然后,阐述 计算机中定点数与浮点数的表示方法。
1.计算机中数的有关概念
在计算机中描述一个数值型数据,需考虑数的长度、数的符号以及小数点三个问题。
(1)数的长度。在数学中,数的长度是指它用十进制表示时所占用的实际位数,如十进 制数 3456 的长度是 4。但在计算机中,数的长度按“比特” (bit,二进制位英文词 binary digit 的缩写,二进制的一位就是 1bit)来计算。同时,由于计算机的存储容量以“字节” (Byte,
等于 8bit)为计量单位,所以数据长度也以字节为单位计算。在计算机中存储的数据的位都是 8 的整数倍,最小长度为 8bit。
值得注意的是:数学中的数的长度有长有短,如 753 的长度为 3,4569 的长度为 4,有几 位就写几位。但在计算机中,同类型的数据(如同属整型的两个数据)的长度是统一的,不足 的部分用 0 填充,这样的做法是为了简化数据的处理。换句话说,计算机中同一类型的数据具 有相同的数据长度。
(2)数的符号。由于数有正负之分,我们平常是用“+”表示正,用“”表示负。在计 算机中也需采用一种方法来描述数的符号, 一般用数的最高位 (左边第一位) 来表示数的符号,
且约定以 0 表示正,以 1 表示负。
(3)小数点。在现实记数中,我们使用“.”来表示小数点。在计算机中如何表示小数点 的问题就同数的符号一样,也值得我们思考。在计算机中表示数值型数据,其小数点的位置是 隐含的,即约定小数点的位置。
2.定点数的表示方法
在定点数的表示方法中,小数点的位置一旦约定,就不再改变。常用的定点数表示方法有 定点整数(也称纯整数)和定点小数(也称纯小数)两种。
(1)定点整数。
定点整数的小数点的位置约定在最低数值位的后面。数据存放的格式是:
S an an1 an2 … a2 a1 a0
符号 量值部分
如果符号位为 0,表示该数是一个正整数,如果符号位为 1,表示该数是一个负整数。
假设这种表示方法中的量值部分存放的是数的绝对值, 则用这种表示方法表示的整数的范 围为:0≤|
x
|≤2 n+1 -1。以 8 位存储单元为例,最高位为符号位,存放整数的范围为1111111 到+1111111。用 16 位存储单元存放符号加绝对值定点整数193 的格式如下:1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 .
注意:193D=(11000001)2,由于 11000001 不足 15 位,故前面补足 7 个 0,最高位用1表 示负数(数的符号)。
假设机器字长为 16 位,符号占一位,数值部分占 15 位,故与下面机器数等效的十进制数 为+32767。
0 111111111111111
∙
符号位 小数点 数值部分
(2)定点小数。定点小数的小数点位置约定在符号位和数值部分的最高位之间,用以表 示小于1的纯小数。数据存放的格式是:
S b1 b2 b3 … bm2 bm1 bm
符号 量值部分
以 8 位存储单位为例,最高位为符号位,存放小数的范围为0.1111111 到+0.1111111。
假如定点数的长度仍为 2 个字节,则十进制小数 0.6876 在计算机内用定点小数表示的形 式如下:
0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1
实际上,0.6876=(0.101100000000011)2,由于最高位表示数的符号,故 2 个字节可以精确 到小数点后第 15 位。
假定机器字长为 16 位,符号位占 1 位,数值部分占 15 位,故与下面机器数等效的十进制 数为2 15 。
1 000000000000001
∙
符号位 小数点 数值部分
目前,计算机中多采用定点纯整数表示,因此,将定点数表示的运算简称为整数运算。
3.浮点数的表示方法
我们在学物理学时就已经知道,电子的质量为 9×10 28 克,太阳的质量为 2×10 33 克,电子 的质量很小, 太阳的质量很大。 由于在计算机中用定点数来直接存储这些很小的数与很大的数 非常困难,因此,必须寻找另一种数的表示方法,这种方法就是浮点表示法。
所谓浮点表示法, 就是把一个数的有效数字和数的范围在计算机的存储单元中分别予以表 示, 把数的范围和精度分别表示, 而数的小数点位置会随比例因子的不同而在一定范围内自由 浮动的表示法。
符号位 数值部分 小数点
符号位 小数点位置 数值部分
.
我们知道:任意一个十进制数N可以写成N=10 e .m,同样,在计算机中任意一个二进制数 N也可以写成N=2 e .m。其中 m 为尾数(mantissa),是一个纯小数,e 为指数(exponent),在 计算机中也称作阶码。在这种记数法中,m 与 e 是有符号的,m 的符号被称为数符,e 的符号 被称为阶符。
为了在计算机中存储这样的一个数,只需存储这个数的阶符、阶码、数符与尾数就可以实 现这个浮点数的存储。存储的格式为:
es e1e2e3…em ms m1m2m3…mn
其中:es 为阶符,0 表示正,1 表示负,e1e2e3…em 为阶码,用定点整数表示,ms 为数符,
0 表示正,1 表示负,m1m2m3…mn 为尾数,用定点小数表示。这种表示方法存在一个问题,
一个数要识别两次符号,给数据的处理带来了很大的不便。
为了规范浮点数的存储,同时也便于软件移植,电气与电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE)制定了标准 IEEE 754,在该标准中定义了 32 位与 64 浮点数的存储格式,一种是单精度浮点数,用 32 位存储;另一种是双精度浮点数,用 64 位存储。且规定基数为 2,阶码 e 用移码表示,尾数 m 用原码表示,根据原码的规格化要求最 高位总是 1,且将 1 默认存储。所谓移码,是为避开阶码的符号,对每个阶码都加上一个正的 常数,称为偏移常数(也称为 Excess 数) ,使能表示的所有阶码都为正整数,变成“偏移”了 的阶码,又称“增码” 。
32 位浮点数和 64 位浮点数的标准格式分别为:
单精度: s(1bit) e(8bit) m(23bit)
双精度: s(1bit) e(11bit) m(52bit)
在两种浮点数中,s 为浮点数的符号位,0 表示正数,1 表示负数。m 为尾数,用小数表 示,e 为阶码,用整数表示,小数点放在尾数域的最前面。
一个规格化的浮点数的真值必须表示为:x=s2 e ×(1.m)
例 1.21 +1000111.0101 不 是 一 个 规 范 的 浮 点 数 。 为 了 规 范 化 , 需 要 把 它 表 示 成 +1.0001110101×2 +6 ,这样的一个数就是一个规范化数。
这个数在计算机中如何存储呢?如果存储为单精度浮点数,符号位 s 为 0,尾数为 00011101010000000000000,为尾数后补 0,确保尾数为 23 位,e 为 6,但在阶码部分不是存 储 00000110,而是存储 6+127,即 133,它的二进制为 10000101。
这里 127 是一个 Excess 数。这样,+1000111.0101 以单精度浮点数存储格式为:
0 10000101 00011101010000000000000
符号 阶码(Excess_127) 尾数
注意:m 前的 1 省略。
如果存储为双精度浮点数,符号位 s 为 0,尾数为 0001110101000000…0000000,为尾数 后补 0,确保尾数为 52 位,e 为 6,但在阶码部分不是存储 0000000110,而是存储 6+1023,
即 1029,它的二进制为 10000000101。
这里 1023 是一个 Excess 数。这样,+1000111.0101 以双精度浮点数存储格式为:
0 10000000101 000111010100000000000…000000000000000000000000
符号 阶码(Excess_1023) 尾数
注意:m 前的 1 也省略。
浮点数以这样的方式存储, 计算机是如何解译呢?也就是说, 计算机是怎么知道存储的数 是一个什么数呢?这里以单精度 11000000111000011000000000000000 为例来说明。
计算机将内存存储的浮点数的解译过程是:
(1)取最左边 1 位做符号,该浮点数最左边 1 位为 1,所以是负数。
(2)将符号位后的 8 位转换成十进制(129)并减去 127,结果为 2,也就是说指数为 2。
(3)在剩下的 23 位前加一个 1 和小数点,可以忽略右边所有多余的 0。本例为 1.11000011。
(4)根据指数的值将小数点移动到正确的位置。本例向右移动 2 位,为 111.000011。
(5)将整数部分化为十进制。本例整数部分的十进制为 7。
(6)将小数部分化为十进制。本例小数部分的十进制为 0.03125。
(7)将整数和小数部分组合起来。本例小数部分的十进制为 7.03125。
从以上可以看出, 计算机中浮点表示法是把一个数的有效数字和数的范围在计算机的一个 存储单元中分别予以表示。 在这种把数的范围和精度分别表示的方法中, 数的小数点位置随比 例因子的不同而在一定范围内自由浮动,这样能扩大计算机中数的表示范围。