【微机原理】基础知识(三)数的运算
计算机中数的运算方法
微型计算机中,有符号数一般都是以补码的形式进行运算。这主要是因为补码的运算比原码简单,符号和数值可以一起参加运算,而且运算的结果也包含符号和数值。由于补码运算时参加运算的两个数都是补码,结果也是补码,所以需要进行转化才能得到真值。
1 定点加减法运算及溢出判断
1.1 定点加减法运算
可以证明,两个数之和/差的补码等于两个数的补码之和/差。
下面通过几个例子来了解定点加减法运算。
例1 设 X = 122,Y = 37,字长 n = 8,求 X − Y 的值。
十进制计算:\(122 - 37 = 85\)
二进制补码计算:
X = 122 的原码是01111010,补码和原码相同;-Y = -37 的原码是10100101,补码是11011011。\[\begin{array}{rr} & 0111\,1010 \\ +& 1101\,1011 \\ \hline & 1\,0101\,0101 \end{array} \]最高位进位自动舍去,得 0101 0101,符号位为 0,结果为正数,真值为 +85。
例2 设 X = 64,Y = 65,字长 n = 8,求 X − Y 的值。
十进制计算:\(64 - 65 = -1\)
二进制补码计算:
X = 64 的原码是01000000,补码和原码相同;-Y = -65 的原码是11000001,补码是10111111。\[\begin{array}{rr} & 0100\,0000 \\ +& 1011\,1111 \\ \hline & 1111\,1111 \end{array} \]符号位为 1,结果为负数;负数补码 = 模 - 绝对值,即 255 = 256 - 1,所以绝对值为1,则真值为 -1。
例3 设 X = 64,Y = 65,字长 n = 8,求 X + Y 的值。
十进制计算:\(64 + 65 = 129\)
二进制补码计算:
X = 64 的原码是01000000,补码和原码相同;Y = 65 的原码是01000001,补码和原码相同。\[\begin{array}{rr} & 0100\,0000 \\ +& 0100\,0001 \\ \hline & 1000\,0001 \end{array} \]符号位为 1,结果为负数,这显然是错误的,因为两个正数相加不可能得到负数,这种情况称为“溢出”。
1.2 溢出及其判断
无论是有符号数还是无符号数,当数的绝对值超过机器所能表示的最大值,就会发生溢出。
对于字长为 n 位的有符号数,除去一位符号位,其余 n - 1 位用来表示数值,则可表示的补码的范围是 \(-2^{n-1} \sim 2^{n-1}-1\)。如果超过这个范围,数值部分的最高位会溢出,并进位到符号位,从而导致运算结果错误。
正如例 3 中 64 + 65 = 129 大于 127,数值部分最高位产生进位,进位一个 1 到符号位,使符号位由 0 变成 1,从而导致运算结果变成负数。
实际上微处理器是根据次高位的进位和最高位的进位的异或来判断是否发生溢出的。对于 8 位(最低位是第 0 位,最高位是第 7 位)的运算,第 6 位的进位\(C_6\),第 7 位的进位\(C_7\),如果两者的异或\(C_6 \oplus C_7=0\),则没有发生溢出,如果为异或结果为1,则发生溢出。
例3中,第 6 位有进位,\(C_6=1\),第 7 为无进位,\(C_7=0\),\(C_6 \oplus C_7=1\),产生溢出。
对于字长为 n 位的无符号数,可表示的补码的范围是\(0 \sim 2^n-1\),超过这个范围就会发生溢出。但无符号的溢出通常不视为错误,因此溢出一般是针对有符号数。
2 定点乘法运算
有符号数的定点乘法运算,需要确定乘积的符号和数值。如果被乘数和乘数符号相同,则乘积为正,若符号相反,则乘积为负,因此可以通过异或运算确定乘积的符号。乘积数值的确定与无符号数的乘法运算相同。
下面是无符号乘法运算的例子。
例4 有两个无符号数 \(A=1111\),\(B=1101\),求 \(A \times B\) 的值。
\[\begin{array}{rrrrrrrrl} & & & & 1 & 1 & 1 & 1 & \text{被乘数} \\ \times & & & & 1 & 1 & 0 & 1 & \text{乘数} \\ \hline & & & & 1 & 1 & 1 & 1 & \\ & & & 0 & 0 & 0 & 0 & & \\ & & 1 & 1 & 1 & 1 & & & \text{部分积} \\ & 1 & 1 & 1 & 1 & & & & \\ \hline 1 & 1 & 0 & 0 & 0 & 0 & 1 & 1 & \text{乘积} \end{array} \]具体流程:乘数从低位到高位逐位与被乘数相乘,得到部分积。乘数的相应位是 1 时,部分积与被乘数相同;乘数相应位是 0 时,部分积也为 0。部分积之和即为乘积。
可见,两个 n 位的无符号数相乘,得到的乘积是 2n 位。
3 定点除法运算
与乘法运算相同,有符号数的除法运算,需要确定商的符号和数值。如果被除数和除数符号相同,则商为正,若符号相反,则商为负,因此可以通过异或运算确定商的符号。商的数值的确定与无符号数的除法运算相同。
3.1 除法运算的过程
下面是无符号除法运算的例子。
首先将除数与被除数的最高几位比较:
- 若除数 ≤ 被除数的最高几位,商为 1,从被除数中减去除数,得到部分余数;
- 否则,商为 0,减去 0(实际上减 0 不必做)。
重复上述过程,将除数与新的部分余数(即改变了的被除数)继续比较,直到被除数的所有位都处理完为止,最后得到商和余数(如果有余数)。
3.2 除法运算的限制
实现除法运算时,必须避免被 0 除或用任何数去除 0:
- 被 0 除:结果为无限大,没有意义,机器无法表示;
- 用任何数去除 0:结果总是 0,等于白做,浪费机器时间。
所以,在进行除法运算时,对参加运算的除数和被除数的大小要加以限制。
整数除法时,一般假定被除数为双倍字长,除数为单字长,商和余数均为单字长。若被除数为单字长,可在左边补上一个字长的 0,扩展为双倍字长。
另外,被除数的高位字长部分要小于除数,以保证商为单字长,否则会发生溢出。
例如,16 位的被除数可以表示为 \(256 \times 高8位+低8位\),如果高 8 位大于除数,则被除数大于\(256 \times 除数\),因此商大于256,从而发生溢出。
浙公网安备 33010602011771号