1. 程式人生 > 實用技巧 >定點數加減運算與移位運算 附帶數學解釋

定點數加減運算與移位運算 附帶數學解釋

目錄


移位運算

邏輯移位

無符號數的移位稱為邏輯移位,移位規則為:邏輯左移,高位丟棄,低位補0;邏輯右移,高位補0,低位丟棄。

如0000100,邏輯左移1位為0001000;邏輯右移1位為0000010

算術移位

有符號數的移位稱為算術移位,移位規則為:符號位不變,數值位按規則移位

數值位的移位規則為:

對原碼,左移高位丟棄,低位補0;右移高位補0,低位丟棄

對反碼,左移高位丟棄,低位補1;右移高位補1,低位丟棄

對補碼,左移高位丟棄,低位補0;右移高位補1,低位丟棄

移位規則確定的邏輯:統一對一個數的原碼反碼補碼移位後,得到的原碼反碼補碼錶示相同的數(不一定與移位前一樣),結合原碼反碼補碼的計算規則,即可明白上述算術移位規則的原理。

可以發現移碼有規律:從右往左數遇到的第一個1,其之前補碼部分與反碼對應部分一致;其之後補碼部分與對應原碼部分一致。


加減運算

從上一節“各種碼的運算”我們已經隱隱感覺到補碼對CPU運算的重大貢獻,但上一節實質針對的是部分情況討論,即A-B,且A>B時,補碼運算規律:結果符號位為正,數值位為A的補碼加上B的補碼。

本次討論更一般的情況。討論之前,先給出結論:

注意,結果取末n位,運算過程若發生溢位則結果出錯;更一般的情況是符號位與數值位一起參與運算,且無論正數負數,整數小數,規則一致,大大簡化了很多不必要的電路設計。沒有討論0是因為0可以在一定程度上劃給正數的陣營,至少從碼的形式上看是沒有問題的。

原理隱於下面運算,需要仔細體悟,親自動手實踐:


溢位判斷

補碼定點加減運算結果是否正確,還得看運算過程是否發生溢位。若發生溢位,運算結果就往往不可信。

溢位判斷有兩種方法:一位符號位判斷溢位兩位符號位判斷溢位

對n位數值位的補碼,溢位原理的理解使用n+1位無符號數,進行範圍的劃分即可明白,簡單一句話:上半部分劃給負數,下半部分留給正數,兩邊分界線為0.

兩個數運算,結果溢位就只有兩種情況:正數+正數負數+負數

一位符號位判斷溢位

符號位相同的兩個數補碼相加,若結果數補碼符號位與原始數不同,則為溢位

兩位符號位判斷溢位

補碼向前擴充一位,進行補碼運算,結果取前兩位。前兩位若不同,則為溢位。

簡單總結

無論哪種方法,不發生溢位時,結果數的第一位都代表真正結果的符號位;兩位符號位判斷溢位的方法中,無論是否溢位,結果數的第一位都代表真正結果的符號位