1
大学信息技术基础教程
1.2.1.5.3 1.5.3 数值信息的表示

1.5.3 数值信息的表示

计算机中的数值信息分为整数和实数两大类,表示方法也有很大的区别。

1)整数

整数不带有小数点,或者说其小数点始终隐含在个位数的后面,故也称之为“定点数”(fixed point integer)。计算机中的整数又可以分为正整数(unsigned integer,即不带符号的整数)和整数(signed integer,即带符号的整数)两类,它们可以用8位、16位、32位甚至更多位数来表示。

8个二进制位表示的正整数的取值范围是0~255(28-1),16个二进制位表示的正整数的取值范围是0~65 535(216-1),32个二进制位表示的正整数的取值范围是0~4 294 967 296(232-1)。

而带符号的整数必须使用一个二进位来作为符号位,一般总是使用最高位(即最左边的一位),使用“0”表示“+”(正数),使用“1”表示“-”(负数)。例如,使用8个二进制位表示整数+56和-56分别如下:

(+56)10=(00111000)2      (-56)10=(10111000)2

由此可见,8个二进制位表示的整数的取值范围是-127~+127(-27+1~+27-1),16个二进制位表示的整数的取值范围是-32 767~+32 767(-215+1~+215-1),若使用n个二进制位表示整数,则其取值范围是-2n-1+1~+2n-1-1。

上面介绍的表示方法称为“原码”表示法,使用统一加减运算规则,方便计算机运算,但数值为负的整数在计算机内部实际上是采用“补码”来表示的。

负整数补码求解的步骤为:先将负整数转换成“原码”的形式,最高位即符号位肯定为“1”,将绝对值的每一位取反,得到称为“反码”的表示形式,最后将“反码”的最低位(末位)加“1”,即可得到“补码”的表示形式。例如,

(-56)=1011,1000

(-56)=1100,0111

(-56)=1100,1000

由于二进制编码的位数较多,故采用每4位用“逗号”隔开的书写格式。

注意,只有负整数才需要通过上面的步骤计算“补码”,而正整数的“反码”和“补码”与“原码”相同。

下面以8个二进制位表示一个整数为例,考察两个非常有趣的数字“0”和“-128”。若将“0”分别看作“+0”和“-0”,则它们的“原码”和“补码”的表示形式如下:

(+0)=0000,0000    (-0)=1000,0000

(+0)=0000,0000    (-0)=0000,0000

可见,当“0”采用“原码”的表示形式时,“0”有两个编码,而采用“补码”来表示后,“+0”和“-0”的编码统一成了“0000,0000”。

下面考察数字“-128”。可以求得“-128”的绝对值是“1000,0000”,显然使用8个二进制位已无法表示。在此,暂“借”1位即使用9个二进制位来表示,最高位仍为符号位,如下:

(-128)=1,1000,0000

(-128)=1,0111,1111

(-128)=1,1000,0000

最后将“借”得的1位“归还”,可得(-128)=1000,0000。这种情况称为“溢出”。引入“补码”后,8个二进制位表示的整数的取值范围扩大成-128~+127(-27~+27-1),16个二进制位表示的整数的取值范围扩大成-32 768~+32 767(-215~+215-1),n个二进制位表示的整数的取值范围是-2n-1~+2n-1-1。n位二进制补码可表示的个数要比n位原码多一个(即补码“1000...00”被用来表示整数-2n-1)。

2)实数

实数通常带有小数点,整数和纯小数都是实数的特例。由于实数的小数点的位置不确定,故也称之为“浮点数”(floating point integer)。

任意一个十进制实数都可以看成是一个10的幂次和一个十进制纯小数之积。例如:

309.46=103×(0.30946)

-0.001784=10-2×(-0.1784)

同理,任意一个二进制实数也可以看成是一个2的幂次和一个二进制纯小数之积。注意,2的幂次也同样是用二进制表示的。例如:

11010.101=2101×(0.11010101)

-0.0001011=2-11×(-0.1011)

由此可以看出,任意一个二进制实数在计算机内部都可以表达成指数(称为“阶码”)和纯小数(称为“尾数”)两部分。

由于阶码可采用原码、补码等不同的编码,尾数的格式及小数点的位置的规定也各不相同,故早期不同计算机对浮点数的表示方法互不兼容。为此,美国电气与电子工程师协会(IEEE)制订了相关的工业标准,现已被绝大多数处理器所采用。