定點數加減運算與移位運算 附帶數學解釋
目錄
移位運算
邏輯移位
無符號數的移位稱為邏輯移位,移位規則為:邏輯左移,高位丟棄,低位補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.
兩個數運算,結果溢位就只有兩種情況:正數+正數,負數+負數
一位符號位判斷溢位
符號位相同的兩個數補碼相加,若結果數補碼符號位與原始數不同,則為溢位
兩位符號位判斷溢位
補碼向前擴充一位,進行補碼運算,結果取前兩位。前兩位若不同,則為溢位。
簡單總結
無論哪種方法,不發生溢位時,結果數的第一位都代表真正結果的符號位;兩位符號位判斷溢位的方法中,無論是否溢位,結果數的第一位都代表真正結果的符號位