1. 程式人生 > >原碼、反碼、補碼之加減運算

原碼、反碼、補碼之加減運算

處理器對兩個運算元進行運算時,按照無符號數求得結果,並相應設定進位標識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。