1、定點數的加減運算
(1) 原碼的加減運算
原碼的加減運算規則:
先判別兩數符號。對於加法,相同爲加,相異爲減;對於減法,相同爲減,相異爲加;
減運算時,比較兩數的絕對值,並以較大絕對值減去較小絕對值。
符號位不參與運算;符號在數值位運算結束後確定。
缺點:原碼加減法過程在計算機中過於複雜。
(2) 反碼的加法運算
反碼加法在最高位進位而丟掉高位時,必須在最低位補上 +1。
(3) 補碼的加減運算
補碼的加減運算是目前計算機中普遍採用的加減法實現的運算方式。
補碼加減運算規則:
- 對於加法,有[X+Y]補 = [X]補 + [Y]補
- 對於減法,有[X-Y]補 = [X]補 + [-Y]補
- [Y]補的各位(包括符號位)均取反,然後最低位+1,可以得到[-Y]補;當然,也可以直接對-Y求補碼。
- 符號位與數值位一起參與運算,運算得到的符號位即爲結果的符號。
(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) 定點原碼一位乘法
定點原碼一位乘法的運算規則如下:
- 初始狀態下,部分積爲全0。
- 判斷乘數的最低位。若最低位爲0,部分積不變;最低位爲1,部分積加上被乘數。
- 將部分積和乘數右移,乘數右移丟棄的部分已經完成運算不再需要;部分積右移丟棄的部分存入乘數的左邊,結束時取出。
- 重複如上步驟,直到乘數原有的所有位全部被讀完(共重複n次)。
- 最後一次右移後,得到的部分積是結果的高位部分,乘數中存儲的是結果的低位部分。
- 將高位和低位部分拼接,並判斷符號位,可以得到最終結果。
缺點:由於大部分計算機中加減運算均採用補碼運算。因此採取原碼乘法還需要額外的轉換。
(2) 定點補碼一位乘法:校正法
給出定點補碼一位乘法的規則前,先說明補碼的移位:
補碼在符號位爲0時,不變;符號位爲1時,右移需在高位補1。雙符號位下,01右移變爲00,10右移變爲11。
補碼的乘法中,不同的乘數對應有不同的運算規則:
對於Y>0,[X·Y]補 = [X]補 · [Y]補
對於Y<0,[X·Y]補 = [X]補 · [Y]補的數值部分 + [-X]補
這種對於Y<0單獨作修正的方法,稱爲定點補碼一位乘法的校正法。
校正法的運算規則如下:
- 首先判斷乘數的符號(被乘數的符號無需考慮),確定是否需要校正;
- 部分積和被乘數採用兩位符號位,並計算第一步:[x]補 · [Y]補的數值部分,該步驟方法與原碼相似,但符號位參與運算。
- 若Y<0,對上面的結果作 +[-X]補 的修正,即可得到最終結果。
缺點:校正法的計算需要判斷是否需要修正,對計算機來說過於複雜。
(3) 定點補碼一位乘法:Booth算法
Booth算法不需要判斷是否校正,實現了補碼一位乘法運算的統一。
Booth算法的運算規則如下:
- 部分積和被乘數均採用兩位符號位,乘數採用一位符號位;乘數在最低位另設一位低位,初始爲0;
- 判斷乘數的最低兩位情況,對於00和11,部分積不變;01時部分積+[X]補;10時部分積+[-X]補;之後做一次右移;
- 重複步驟2,直到乘數右移至只剩兩位原有的數(應爲一個符號位和一個最高數值位),共重複n次;
- 進行最後一次判斷(共做n+1次),處理部分積但不做移位,將得到的部分積與乘數儲存的低位部分拼接,得到最終結果。
3、定點數的除法運算
(1) 定點原碼一位除法:恢復餘數法
在除法過程中,需要用餘數減去除數,可能會出現餘數等於除數,大於除數或小於除數三種情形;等於除數時表示除盡,上商爲1並結束計算;大於除數時,上商爲1,完成減法並移位後重復操作;小於除數時,上商爲0並移位後重復操作。由這個思路可以得到恢復餘數法的運算規則。
恢復餘數法的運算規則如下:
- 初始餘數爲被除數,以兩位符號位表示,不參與運算;
- 對餘數+[-x]補,得到新的餘數;若新餘數爲正,上商爲1;若新餘數爲負,上商爲0,並加上[x]補恢復餘數;
- 上商步驟完成後,餘數左移一位,得到新餘數;
- 重複上面的步驟,直到達到規定的精度或除盡。
- 商即爲上商得到的結果;餘數爲最後一次得到的餘數 R * 2-n
缺點:恢復餘數法時,對於餘數小於0的情形需要多做一個加法操作,增加了計算次數;而且餘數的正負性隨着被除數和除數改變而改變,不具有規律性,因此在計算機內需要進行的計算次數不能固定,給電路的設計增加了困難。
(2) 定點原碼一位除法:加減交替法
根據恢復餘數法,可以得到:y>0時,下一次運算的結果爲2R - |Y|;y<0時,下一次運算的結果爲2(R+ |Y|) - |Y| = 2R + Y。
注:左移一次,若左邊丟棄的數是0,就相當於整個數乘以2。
由此,我們可以使用在不同情況下的交替加減的方法來代替恢復餘數法,以此確定計算的次數。這種方法叫做加減交替法。
加減交替法的運算規則如下:
- 初始餘數爲被除數,以兩位符號位表示,不參與運算;
- 若餘數爲正,加上[-Y]補;若餘數爲負,加上[Y]補;由此得到新餘數
- 若新餘數爲正,上商爲1並左移;若新餘數爲正,上商爲0並左移;
- 重複上面的步驟,直到達到規定的精度或除盡;若最後一次的餘數爲負,需要恢復餘數以得到正確的餘數;
- 商即爲上商得到的結果;餘數爲最後一次得到的餘數 R * 2-n