原碼、反碼、補碼之加減運算
處理器對兩個運算元進行運算時,按照無符號數求得結果,並相應設定進位標識C;同時,根據是否超出符號數的範圍設定語出標識V。也就是說,如果將參加運算的運算元認為是無符號數,就應該關心進位;如果認為是有符號數,則要注意是否溢位。
所有的負數的反碼等於原碼各位取反(符號位除外),補碼等於反碼加一(符號位不變)。十六進位制也是先轉化為2進位制的補碼。 補碼的用途是讓機器學會減法運算的。因為所有的處理器是電路做的,電路其實只是加法器,只能做加法。如何能讓電腦做減法呢?使用補碼,減去一個數就等於加上它的補碼。
原碼加減法比較複雜,需要事先判斷數的符號,然後決定做加法還是做減法運算。
補碼的加減法運算比較簡單,採用補碼加減法運算,可將“正數加負數”的操作,轉化為“正數加正數”的操作。一般計算機採取補碼進行加減法運算。因為減法運算可以看作被減數加上一個減數的負值,即A-B=A+(-B),故在此將機器中的減法運算和加法運算合在一起討。
1、補碼加減的基本公式
補碼加法的基本公式為:
整數 [A]補+[B]補=[A+B]補 (mod 2n+1)
小數 [A]補+[B]補=[A+B]補 (mod 2)
對於減法:
因A-B=A+(-B),則[A-B]補=[A+(-B)]補,由補碼加法基本公式可得:
整數 [A-B]補=[A]補+[-B]補 (mod 2n+1)
小數 [A-B]補=[A]補+[-B]補 (mod 2)
[X+Y]補= [X]補+[Y]補 [X-Y]補= [X]補+[-Y]補
2、溢位判斷計算機中超出機器字長的現象,稱為溢位。在補碼定點運算中,必須對結果是否溢位進行判斷。
如果運算的結果,超出了計算機能表示的數的範圍,會得出錯誤的結果,這種情況稱為溢位。
對於字長為n的計算機,那麼它能表示的定點補碼範圍為-2n-1≤X≤2n-1-1,若運算結果小於-2n-1或大於2n-1-1,則發生溢位, 發生溢位時數值的有效位佔據了符號位。
兩種判斷方法:
(1)用一位符號位判斷溢位
兩個相同符號數相加,其運算結果符號(若符號位有進位,則將1丟掉)應與被加數相同,否則產生溢位。(這種判斷方法不容易由硬體來實現)
(2)用兩位符號位判斷溢位
變形補碼: 用變形補碼做加法操作時,兩位符號位連同數值部分一起參加運算。
運算結果溢位判斷規則:
正常時兩個符號位的值相同
兩個符號位不同,則表明發生了溢位。
雙符號位溢位判斷法
雙符號含義: 00表示運算結果為正數;
01表示運算結果正溢位;
10表示運算結果負溢位;
11表示運算結果為負數。
第一位符號位為運算結果的真正符號位。
3、例項(補碼加減+溢位判斷)
(-3)+(-4)(假設機器碼字長8位(byte),其中1位表示符號位):
-3:
原碼:1000 0011
反碼:1111 1100
補碼:1111 1101
-4:
原碼:1000 0100
反碼:1111 1011
補碼:1111 1110
==================
1111 1101
+11111110
-------------------------------
111111001
==================
運算結果:1111 1001(補碼形式)
結果反碼:1111 1000
結果原碼:1000 0111(-7)
因為雙位符號位為11,所以運算結果為負數,且結果未溢位。運算結果為-7。