===================================================================================================================================
處理器對兩個操作數進行運算時,按照無符號數求得結果,並相應設置進位標誌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]補
運算過程舉例(假設機器字長4位,其中1位表示符號位):
補碼的加、減法的例子
(a) (-7)+(+5) (b)(-4)+(+4)
1,001 1,100
0,101 0,100
1,110 =-2 0,000 =0
(c) (+5)+(+4) (d)(-7)+(-6)
0,101 1,001
0,100 1,010
1,001 =溢出 0,011 =溢出
計算機中這種超出機器字長的現象,稱爲溢出。1 丟掉
在補碼定點運算中,必須對結果是否溢出進行判斷。
12.溢出判斷
.如果運算的結果,超出了計算機能表示的數的範圍,會得出錯誤的結果,這種情況稱爲溢出。
–對於字長爲n的計算機,那麼它能表示的定點補碼範圍爲-2n-1≤X≤2n-1-1
–若運算結果小於-2n-1或大於2n-1-1,則發生溢出
–發生溢出時數值的有效位佔據了符號位。
.兩種方法
①用一位符號位判斷溢出
②用兩位符號位判斷溢出
用一位符號位判斷溢出
.兩個相同符號數相加,其運算結果符號應與被加數相同,否則產生溢出;
.相異符號數相加,相同符號數相減,不會產生溢出。
.兩個相異符號數相減,其運算結果符號應與被減數相同,否則產生溢出。
.由於減法運算在機器中是用加法器實現的,如此有如下結論:
–無論是加法還是減法,只要實際參加操作的兩個數(減法時即爲被減數和“求補”以後的減數)符號相同,結果又與原操作數的符號不同,即爲溢出。
用一位符號位判斷溢出
.準則:“兩個相同符號數相加,其運算結果符號應與被加數相同,否則產生溢出”
–這種判斷方法不容易由硬件來實現。
.先判斷操作數的符號是否相同,再判斷結果的符號與原操作數的符號是否相同
.通常用符號位產生的進位和最高有效位向符號位產生的進位進行異或操作後,按其結果進行判斷。
–若異或結果爲1(即不同),則溢出;
–若異或結果爲0(即相同),則沒有溢出。
補碼的加、減法的溢出判斷
運算過程舉例(假設機器字長4位,其中1位表示符號位):
[X+Y]補= [X]補+[Y]補 [X-Y]補= [X]補+[-Y]補
(a)(-7)+(+5) (b)(-4)+(+4)
1,001 1,100
0,101 0,100
1,110 =-2 10,000 =0
(c) (+5)+(+4) (d)(-7)+(-6)
0,101 1,001
0,100 1,010
1,001 =溢出 1 0,011 =溢出
1 丟掉
用兩位符號位判斷溢出
.變形補碼
.用變形補碼做加法操作時,兩位符號位連同數值部分一起參加運算。
.運算結果溢出判斷規則:
–正常時兩個符號位的值相同
–兩個符號位不同,則表明發生了溢出。
雙符號位溢出判斷法
雙符號含義: 00表示運算結果爲正數;
01表示運算結果正溢出;
10表示運算結果負溢出;
11表示運算結果爲負數。
第一位符號位爲運算結果的真正符號位。
例1設有效數值位爲4,X= -0.1001,Y= - 0.0101,求 [X+Y]=?
解: [X]補= 11.0110+1 = 1 1. 0 1 1 1
+ [Y]補= 11.1010+1 = 1 1. 1 0 1 1
[X+Y]補 = 1 1 1. 00 1 0
最高位1丟掉 兩個符號位相同,運算結果無溢出
最終結果爲:X+Y= - 0.1110
例4設有效數值位爲4, X= -0.1011,Y= 0.0111,求 [X-Y]=?
解: [X]補= 11.0100+1=11.0101
[Y]補= 00.0111 [-Y]補=11.1001
[X]補 = 1 1. 0 1 0 1
+ [-Y]補 = 1 1. 1 0 0 1
[X+Y]補 = 11 0. 1 1 1 0
兩個符號位10不同,運算結果負溢出。