第三章根据书本【计算机组成原理(微课版) 】进行整理
第三章 – 运算方法与运算器
3.2 定点加减法运算
3.2.1 补码加减法运算方法
1. 补码加法
在以 M 为模时,两数补码的和等于两数和的补码。
补码加法的运算公式如下:
[x]补 + [y]补 = [x+y]补(mod M)
[-B]补 = ( [B]补 连同符号位进行取反加1 )
原码的加法:
正 + 正 => 绝对值相加,符号为正
负 + 负 => 绝对值相加,符号为负
正 + 负 => 绝对值大的减去绝对值小的,符号与绝对值大的相同
原码的减法:
转为原码的加法进行求解
例题:
- x = 0.1010,y = 0.0101,求 [x]补 + [y]补 。
根据公式:[x]补 + [y]补 = [x+y]补
x+y = 0.1010 + 0.0101 = 0.1111
[x+y]补 = 0.1111
[x]补 + [y]补 = 0.1111 - x = -0.1010,y = -0.0100,求 [x+y]补 和 x+y
根据公式:[x]补 + [y]补 = [x+y]补
可得:[x+y]补 = [x]补 + [y]补
[x]补 = 1.0110
[y]补 = 1.1100
[x]补 | 1.0110 | |
+ | [y]补 | 1.1100 |
和 | [x+y]补 | 11.0010 |
符号进位的值为模数,应进行舍弃
[x+y]补 = 1.0010
由补码求真值可得:x+y = -0.1110
补码求真值:
1.对补码,符号位取出后,对剩下的值再进行取反加1
例如,[x+y]补 = 1.0010 => -0.0010 => -0.1101 => -0.1110(最后结果)
2.也可以对补码进行减1取反,一样可以求得真值
2. 补码减法
补码减法的公式如下:
[x-y]补 = [x]补 + [-y]补 = [x]补 - [y]补(mod M)
对于定点小数,M = 2;对于定点整数,M = 2n+1 ,其中 n 不含符号位的位数。
[-y]补 - ( -[y]补 ) = [-y]补 + [y]补 = [-y + y]补 = 0
所以 [-y]补 = -[y]补
例题:
- x = 0.1001,y = 0.0110,求 [x]补 - [y]补。
根据公式: [x-y]补 = [x]补 + [-y]补 = [x]补 - [y]补
[x]补 - [y]补 = [x]补 + [-y]补
[x]补 = 0.1001
[y]补 = 0.0110
[-y]补 = 1.1010
[x]补 + [-y]补 = 0.1001 + 1.1010 = 10.0011
符号位进位的值为模数,应该舍弃
[x]补 - [y]补 = 0.0011 - x = -0.1001,y = -0.0110,求 [x]补 - [y]补 和 x-y。
根据公式: [x-y]补 = [x]补 + [-y]补
[x]补 - [y]补 = [x]补 + [-y]补
[x]补 = 1.0111
-y = 0.0110
[-y]补 = 0.0110
[x]补 + [-y]补 = 1.0111 + 0.0110 = 1.1101
所以,
[x]补 + [-y]补 = 1.1101
x-y = -0.0011
3.2.2 溢出检测
1. 溢出的概念
运算结果超出数据类型的表示范围称为溢出。
运算的结果为正,绝对值超过表示范围时,称为正溢;运算的结果为负,绝对值超过表示范围时,称为负溢。
2. 溢出检测
- 根据操作数和运算结果的符号位是否一致进行检测
只有两个符号相同的数相加时,才有可能发生溢出,因此可以根据操作数和运算结果的符号位是否一致进行检测。
正正得负,负负得正时为溢出
加法:
上溢 ---- 正 + 正 = 负
下溢 ---- 负 + 负 = 正
溢出例子:
未发生溢出例子:
减法转为加法,[x]补 + [-y]补 => 负 + 负 => 正 => 溢出
- 根据运算过程中最高数据位的进位与符号位的进位是否一致进行检测。设运算时最高有效数据位产生的进位信号为Cd,符号位产生的进位信号为Cf,则溢出检测表达式为:V = Cf⊕ Cd即当运算过程中最高数据位的进位与符号位的进位不一致时运算结果发生溢出。
最高数据位的进位:符号位的右一位相加向符号位的进位
- 例题:
- 计算机的字长为4位,x = -111,y = 110,求 [x-y]补。
[x]补 = 1001
[-y]补 = 1010
[x-y]补 = [x]补 + [-y]补 = 1001 + 1010 = 10,011
符号位的进位为 1,最高数据位的进位为 0,两个进位不一致所以发生了溢出。
- 利用变形补码的符号位进行检测。
变形补码即用两个二进制位来进行数据的符号表示。正数的符号以“00”表示,负数的符号以“11”表示。一般称左边的符号位为第1符号位,右边的符号位为第2符号位,第1符号位永远代表正确的符号位。
补码的加减法的运算公式对变形补码依旧成立,若运算结果的符号位为“01”或“10”,则分别表名发生了上溢和下溢。
运算结果的双符号位相同时无溢出,相异时溢出。
双符号位补码:模4补码
单符号位补码:模2补码
例题:
3.2.3 加减法的逻辑实现
1. 全加器
3.3 定点乘法运算
3.3.1 原码一位乘法
1. 原码一位乘法运算方法
- 乘积符号的确定
根据二进制原码的特点,乘积的符号与两个操作数符号间的关系为“异或关系”,即:
Pf = x0 ⊕ y0 - 乘积的数值
乘积的数值可以由乘数与乘数的绝对值之积求得。
手动计算二进制数乘积:
原码一位乘法算法流程图
逻辑右移,高位补0
原码一位乘:
先加法再移位。乘数的符号位不用参与运算,小数点在最后结果第一位后
计算出数值后,修改符号位
例题:
x = 0.1101,y = -0.1011,用原码一位乘法求 x*y。
由例题可知,用循环累加和逻辑右移操作实现了原码一位乘法;两个n位数参加乘法运算要进行n次加法和n次位移操作;注意加法运算可能出现局部溢出(图中第2、4次位移之前),但是这只是中间计算结果,运算完毕还要进行逻辑右移操作,右移时应该将进位位移入部分积的最高位。
每次只利用乘数y中的1位来计算位积,最终需要将n个位积全部累加起来得到乘积,这种方法称为原码一位乘法。
3.3.2 补码一位乘法
2. 补码一位乘法的算法
- 乘数采用单符号位,末位增设附加为yn+1,初值为0
- 利用yn+1与yn的差值判断各步的具体运算,差值为1,累加上[x]补;差值为0,累加上0;差值为-1,累加上[-x]补。累加完成后需要进行算术右移的操作,初值为0。
- 按照上述算法进行n+1次累加操作,n次右移操作即可完成乘积运算。
- 补码乘法中,符号位参与运算,不需要单独计算符号位。
补码一位乘法算法流程图
进行n次(n为乘数的位数)加法和位移操作,最后在多来一次加法操作。
补码一位乘法:每次加法可能 +0、+[x]补、+[-x]补
yn+1 - yn = 0,+0
yn+1 - yn = 1,+[x]补
yn+1 - yn = -1,+[-x]补
每次位移为补码的算术右移,符号位不变,最高位根据符号位补位,符号位为1,补1,符号位为0,补0
符号位参与运算
符号位不用单独进行确定
yn+1初始值为0,后面运算过程中的值为前面移过来的数
多了一位附加位,其他数也要多一位数字
例题:
[x]补 = 1.0111,[y]补 = 1.0011,求 [x*y]补。
3.4 定点除法运算
3.4.1 原码一位除法
1. 原码恢复余数法
恢复余数法:
将余数恢复成比较操作之前的数值。
在原码恢复余数法中,比较被除数(余数)与除数的大小是用减法实现的。对于原码除法而言,操作数以绝对值的形式参与运算。相减结果为正(符号位为0)说明够减,商上1;相减结果为负(符号位为1)说明不够减,商上0。
符号需要单独进行处理:符号位 = xs ⊕ ys
商上0或1后,得到余数,余数末尾补0
被除数或余数 - 除数,用补码
逻辑左移,补0
例题:
[x]原 = 1.1001,[y]原 = 0.1011,求 [x]原 ÷ [y]原。
3.5 浮点运算
3.5.1 浮点加减法运算
1. 阶码和尾数采用补码表示的浮点加减运算
对阶:使阶码相等的过程。
- 对阶
对阶的原则是小的阶码向大的阶码看齐,因为小阶码数值增大时,尾数部分会右移,舍去的是尾数的低位部分,只有很小的精度影响,而如果让大阶码向小阶码看齐,将会失去尾数的高位部分。
对阶的步骤:
(1) 求阶差,通过对两个阶码进行减法运算实现
(2) 阶码的调整与尾数的位移,注意尾数右移通常将最低位的移出位暂时保留,称为保留附加位 - 尾数运算
- 结果规格化
可以让尾数的符号位扩展为双符号位,当尾数运算结果不是11.0xxxx或00.1xxxx的形式时,应进行相应的规格化处理。
当尾数符号位为01或10时,运算结果上溢,需要向右规格化,且只需要将尾数右移一位,同时将结果的阶码值加1。
当尾数的运算结果为11.1xxxx或00.0xxxx时需要向左进行规格化,而且左移次数不固定,与运算结果的形式有关。向左规格化时尾数连同符号位一起左移,直到尾数部分11.0xxxx或00.1xxxx的形式为止。向左规格化时阶码做减法,左移多少位减多少。 - 舍入
末位恒置1法:只要因位移而丢失的位中有1位是1,就把运算结果的最低位置1,不管最低位原来是1还是0。
0舍1入法:当丢失位数的最高位是1时将尾数的末位加1,类似于十进制数的四舍五入。
注意舍入操作可能会破坏规格化结果,所以舍入操作后还需要再次进行规格化处理。 - 溢出判断
由于浮点数中阶码的位数决定数的表示范围,对于浮点数,当阶码出现溢出,表示运算结果出现溢出,即当阶码的符号位为01或10时表示运算结果溢出。
阶码溢出为真溢出,尾数溢出未必导致整体溢出。
分数转为二进制真值:
-(5/256) = (-5)*2-8 = (-101)2 * 2-8
例题:
- X = 2-101