计算机组成原理:定点数的运算

1、定点数的加减运算

(1) 原码的加减运算

原码的加减运算规则
先判别两数符号。对于加法,相同为加,相异为减;对于减法,相同为减,相异为加;
运算时,比较两数的绝对值,并以较绝对值减去较绝对值。
符号位不参与运算;符号在数值位运算结束后确定。

缺点:原码加减法过程在计算机中过于复杂。

(2) 反码的加法运算

反码加法最高位进位而丢掉高位时,必须在最低位补上 +1

(3) 补码的加减运算

补码的加减运算是目前计算机中普遍采用的加减法实现的运算方式。
补码加减运算规则

  1. 对于加法,有[X+Y]补 = [X]补 + [Y]补
  2. 对于减法,有[X-Y]补 = [X]补 + [-Y]补
  3. [Y]补的各位(包括符号位)均取反,然后最低位+1,可以得到[-Y]补;当然,也可以直接对-Y求补码。
  4. 符号位与数值位一起参与运算,运算得到的符号位即为结果的符号。

(4) 溢出的判别方法

当运算结果超出了机器数的位数所能表示的数值范围时,称为溢出上溢

对应的概念是,浮点数中数值的绝对值小于浮点数能表示的绝对值最小的数时,称为下溢。

由于计算机中实现加减运算往往使用补码,因此这里只给出补码加减的溢出判别法:

1) 符号对比法

由于在加减运算中,只有当加法同号时才会发生溢出。(减法异号由补码加减规则可以变为加法同号)
因此,在加法中,若两加数符号相同,只需比较结果得出的符号是否发生变化,即可得知是否发生溢出。
设加数X的符号位为fx,Y的符号位为fy,结果的符号位为fs。则溢出发生的判断式为:f = fx·fy·~fs + ~fx·~fy·fs

2) 进位匹配法

由方法1可以发现,当最高数值位产生进位,而符号位不进位时,必然发生符号改变;若最高数值位不进位,而符号位进位时,也必然发生符号改变。因此,判断最高数值位符号位进位是否匹配,就可以得知是否发生溢出。
设最高数值位的进位为Cn,符号位的进位为Cs,则溢出发生的判断式为: f = C ⊕ Cs

3) 双符号位法

由方法2可以发现,假设符号位前还有一位,当进位不匹配时,会影响符号位和其前一位的数值。由此可以总结出一种新的溢出判别法:用两位符号位表示正负,其中00为正11为负。运算时,两个符号位均参与运算。若结果的符号位出现01和10的异常情况,说明发生了溢出;否则没有溢出。其中,10表示发生负溢出01表示发生正溢出
设低符号位为S1,高符号位为S2,则溢出发生的判断式为:f = S1 ⊕ S2

由于补码的减法是通过加法实现,因此再转为加法运算后,均可用以上方法判断溢出。

2、定点数的乘法运算

(1) 定点原码一位乘法

定点原码一位乘法的运算规则如下:

  1. 初始状态下,部分积为全0。
  2. 判断乘数的最低位。若最低位为0,部分积不变;最低位为1,部分积加上被乘数
  3. 部分积和乘数右移,乘数右移丢弃的部分已经完成运算不再需要;部分积右移丢弃的部分存入乘数的左边,结束时取出。
  4. 重复如上步骤,直到乘数原有的所有位全部被读完(共重复n次)。
  5. 最后一次右移后,得到的部分积是结果的高位部分,乘数中存储的是结果的低位部分
  6. 将高位和低位部分拼接,并判断符号位,可以得到最终结果。

缺点:由于大部分计算机中加减运算均采用补码运算。因此采取原码乘法还需要额外的转换。

(2) 定点补码一位乘法:校正法

给出定点补码一位乘法的规则前,先说明补码的移位:
补码在符号位为0时,不变;符号位为1时,右移需在高位补1。双符号位下,01右移变为00,10右移变为11。

补码的乘法中,不同的乘数对应有不同的运算规则:
对于Y>0,[X·Y]补 = [X]补 · [Y]补
对于Y<0,[X·Y]补 = [X]补 · [Y]补的数值部分 + [-X]补
这种对于Y<0单独作修正的方法,称为定点补码一位乘法的校正法

校正法的运算规则如下:

  1. 首先判断乘数的符号(被乘数的符号无需考虑),确定是否需要校正;
  2. 部分积和被乘数采用两位符号位,并计算第一步:[x]补 · [Y]补的数值部分,该步骤方法与原码相似,但符号位参与运算。
  3. 若Y<0,对上面的结果作 +[-X]补 的修正,即可得到最终结果。

缺点:校正法的计算需要判断是否需要修正,对计算机来说过于复杂。

(3) 定点补码一位乘法:Booth算法

Booth算法不需要判断是否校正,实现了补码一位乘法运算的统一。

Booth算法的运算规则如下:

  1. 部分积和被乘数均采用两位符号位,乘数采用一位符号位;乘数在最低位另设一位低位,初始为0;
  2. 判断乘数的最低两位情况,对于00和11,部分积不变01时部分积+[X]补10时部分积+[-X]补;之后做一次右移;
  3. 重复步骤2,直到乘数右移至只剩两位原有的数(应为一个符号位和一个最高数值位),共重复n次;
  4. 进行最后一次判断(共做n+1次),处理部分积但不做移位,将得到的部分积与乘数储存的低位部分拼接,得到最终结果。

3、定点数的除法运算

(1) 定点原码一位除法:恢复余数法

在除法过程中,需要用余数减去除数,可能会出现余数等于除数,大于除数或小于除数三种情形;等于除数时表示除尽,上商为1并结束计算;大于除数时,上商为1,完成减法并移位后重复操作;小于除数时,上商为0并移位后重复操作。由这个思路可以得到恢复余数法的运算规则。

恢复余数法的运算规则如下:

  1. 初始余数为被除数,以两位符号位表示,不参与运算
  2. 对余数+[-x]补,得到新的余数;若新余数为正,上商为1;若新余数为负,上商为0,并加上[x]补恢复余数
  3. 上商步骤完成后,余数左移一位,得到新余数;
  4. 重复上面的步骤,直到达到规定的精度或除尽。
  5. 商即为上商得到的结果;余数为最后一次得到的余数 R * 2-n

缺点:恢复余数法时,对于余数小于0的情形需要多做一个加法操作,增加了计算次数;而且余数的正负性随着被除数和除数改变而改变,不具有规律性,因此在计算机内需要进行的计算次数不能固定,给电路的设计增加了困难。

(2) 定点原码一位除法:加减交替法

根据恢复余数法,可以得到:y>0时,下一次运算的结果为2R - |Y|;y<0时,下一次运算的结果为2(R+ |Y|) - |Y| = 2R + Y。
注:左移一次,若左边丢弃的数是0,就相当于整个数乘以2。
由此,我们可以使用在不同情况下的交替加减的方法来代替恢复余数法,以此确定计算的次数。这种方法叫做加减交替法。

加减交替法的运算规则如下:

  1. 初始余数为被除数,以两位符号位表示,不参与运算
  2. 若余数为正,加上[-Y]补;若余数为负,加上[Y]补;由此得到新余数
  3. 若新余数为正,上商为1并左移;若新余数为正,上商为0并左移
  4. 重复上面的步骤,直到达到规定的精度或除尽;若最后一次的余数为负,需要恢复余数以得到正确的余数;
  5. 商即为上商得到的结果;余数为最后一次得到的余数 R * 2-n
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章