在计算机系统中表示数的最基本方法是使用一串位,即一个二进制数。我们首先描述整 数的二进制表示及算术运算,然后将简单介绍浮点数的表示。
1.4.1 整数
考虑一个 n 位的向量
B = bn-1…b1b0
对于0 ≤ i ≤ n - 1,bi = 0 或 1。这个向量在 0 到 2n-1 的范围内可以用一个无符号整数 V(B) 表示,这里
8
9
V (B) = bn-1 × 2n-1 + … + b1 × 21+ b0 × 20
这个和(sum)是 0,进位输出(carry-out)是 1。为了完成多位数相加,我们使用一种类似于 十进制数笔算中使用的方法。从这个位向量的最
低位(右边)开始进行两位相加,并将进位传递 到它的高位(左边)上去。某位上两个数相加所 得的进位输出作为左边下一位的进位输入(carry-in)。进位输入必须与那个位置的两位相加,产生 和以及进位输出。例如,如果某位的两个数都是
1,并且进位输入也是 1,则和为 1,进位输出也为 1,即表示数值 3。
2.有符号整数的加法和减法
我们介绍了表示正数和负数(或简称为有符号数(signed number))的三种系统。这些系 统的不同之处仅在于对负数的表示方式。从是否容易执行算术运算的观点来看它们的优势可以 归纳如下。原码系统在表示上是最简单的,但是它对于执行加法和减法的运算是最不便的。反 码表示法稍微好一些,补码系统对于执行加法和减法运算是最有效的。
为了理解补码的算术运算,考虑以 N 为模的加法(简写成mod N)。描述无符号整数 mod N 加法的有效图示方式是使用一个圆,沿着它的圆周标记上值 0 到 N-1,如图 1-5a 所示。考 虑当 N = 16 的情况,如图 1-5b 所示。十进制数 0 到 15 可以用圆外侧的 4 位二进制数 0000 到 1111 表示。就十进制数而言,(7+5) mod 16 运算得到的值是 12。我们使用图形执行这个运算,
在圆外侧找到7(0111) 的位置,然后按顺时针方向移动 5 个单位就到达了答案 12(1100) 处。类 似地,(9 + 14) mod 16 = 7,即在圆上找到 9(1001),然后按顺时针方向移动 14 个单位越过 0 的 位置就到达答案7(0111) 处。对于任何无符号数 a 和 b 来说,这种图形技术对计算(a+b)mod 16 都是有效的,即为了完成加法,定位 a,然后按顺时针方向移动 b 个单位就可以得到 (a + b) mod 16 的结果。
现在考虑对于模数为16 的圆的另一种不同解释。我们按照圆内侧所示的补码表示将圆外 侧的二进制向量重新解释成从 -8 到 +7 的有符号数。
将mod 16 的加法技术应用在将 +7 加到 -3 的例子上。这两个数的补码表示分别是 0111 和1101。为了完成两数相加,在图 1-5b 的圆周上找到 0111,然后按顺时针方向移动 1101 (13) 步到达了0100 处,得到了 +4 的正确答案。值得注意的是,-3 的补码表示被解释成一个无符 号数以表示移动的步数。
如果采用从右到左按位加的方法完成这个加法,我们得到:
0 1 1 1 + 1 1 0 1 1 0 1 0 0 进位
如果在这个加法中忽略第四位上的进位,就得到了一个正确的答案。实际上就是这样做 的。忽略这个进位是对 N 取模运算的自然结果。当我们在图1-5b 中绕着圆移动时, 1111 值的 下一个值通常应该是10000,而我们回到了 0000 值。
使用补码表示系统的 n 位有符号数的加法和减法规则可以描述如下:
● 两个数相加(add)时,它们的 n 个表示位相加,忽略最高有效位(MSB)上的进位 位。如果实际结果是在 -2n-1到 +2n-1-1 的范围之内,那么它们的和将是用补码表示的 代数运算的正确值。
● X和 Y 两个数相减(subtract),也就是执行 X-Y 时,求出 Y 的补码形式,然后使用加 11
12
进位输出 1 1 +
0 1 1
0 1 + 0
0 0 +
1 0 1 +
图1-4 1 位数的加法
第1 章 计算机的基本结构 · 9
0000 0001 0010
0011
0100
0101
0110 1000 0111
1001
0000 0001 0010
0011
0100
0101
0110 1000 0111
1001 作称为符号扩展(sign extension)。
4.整数算术运算中的溢出
高有效位)位置上得到的进位输出位是0。如果我们将 -4 和 -6 相加,得到 0110 = +6,也是
号以及结果的符号。当两个加数具有相同的符号,而和的符号与加数的符号不同时就发生了 溢出。
对两个数做减法的时候,检测溢出的测试方法要做相应的修改,但是这个方法还是很简 单的,参见习题1.10。
1.4.2 浮点数
到目前为止我们只考虑了整数,它有一个隐含的二进制小数点在数的最右端,也就是 b0
位的后面。在字长为32 位的计算机中,如果我们用一个全字去表示一个补码形式的有符号整 数,数的表示范围是 -231到+231-1。在十进制中,这个范围比 -1010到+1010要小一些。
如果假设隐含的二进制小数点正好在符号位的右方,也就是32 位表示中左端的位 b31到 b30之间,那么同样的32 位模型还能表示在 -1 到 +1-2-31范围内的小数。在这种情况下,可 以表示的最小的小数大约为10-10。
这两种定点(fixed-point)数表示法的表示范围对于许多科学和工程计算来说是不够的。
为方便起见,我们希望能有一种二进制数表示法,这种方法能够容易地将非常大的整数和非常 小的小数包含进来。要做到这一点,二进制小数点的位置应该是可变的,并且随着计算的进行 可以自动调整,而计算机必须能够以这种形式表示数字并对其进行操作。在这种情况下,我们 说二进制小数点是浮动(float)的,并称数字为浮点数(floating-point number)。
因为浮点数中二进制小数点的位置是可以变化的,所以在浮点表示中必须明确指出小数 点的位置。例如,在我们熟悉的十进制科学记数法中,数字可以记为6.0247× 1023、3.7291×
10-27、-1.0341×102、-7.3000×10-14等。我们说这些数具有5 位有效数字(significant digit)
的精度。它们的比例因子(scale factor)1023、10-27、102和10-14指示了相对于有效数字的十 进制小数点的实际位置。同样的方法也可以用来表示计算机中的二进制浮点数,只不过要用2 来做比例因子的基数。因为基数是固定的,所以并不需要在表示中给出。指数可以是正数也可 以是负数。
总的来说,二进制浮点数可以表示为:
● 数的符号 一些有效位
●
有符号的比例因子指数(隐含的基数为2)
●
已经制定的表示32 位浮点数的国际 IEEE(电气和电子工程师协会)标准使用 1 个符号位、
23 个有效位以及 8 位比例因子的有符号指数(隐含的基数为 2)。在十进制中,所表示的数的 范围大约在 ±10-38到 ±1038范围内,这对于大部分科学与工程计算来说足够了。IEEE 标准还 定义了64 位的表示,以提供更多的有效位和更多的有符号指数位,从而得到更高的精度和更 大的取值范围。
浮点数表示和浮点数的算术运算将在第9 章中详细介绍。附录 B 到 E 中描述的一些商 用处理器在它们的指令集中包含了对浮点数的操作,并有一些专门用于保存浮点数的处理器 寄存器。