原碼不能直接參加運算,可能會出錯。例如在數學上,1 + (-1) = 0, 而在二進制中 0000 0001 + 1000 0001 = 1000 0010,換算成十進制爲130 ≠ 0 。顯然是錯的。
所以計算機中數值一律用補碼來表示。
計算機補碼加減及溢出
想要了解掌握補碼,應先知道其運算規則:
-
【X+Y】補 = 【X】補 +【Y】補
-
【X-Y】補 = 【X】補 +【-Y】補
例一:
用補碼求 【 X - Y 】補
若:【X】補 = 0010 0101
【-Y】補 = 1100 1101
【X-Y】補 = 【X】補 +【-Y】補 = 0010 0101 + 1100 1101 = 1111 0010
另外提兩點,結果得符號位 0 爲正數,【X-Y】補 =【X-Y】原碼 ,符號位爲 1 爲負數,【【X-Y】補 】補 = 【X-Y】原碼
本例中【X-Y】補 = 1111 0010 ,符號位爲 1 爲負數,所以【【X-Y】補 】補 =【X-Y】原碼 。
上述補碼運算結果是正確的,但有時在補碼運算過程中也會出現錯誤的計算。
例二:
設 X = +100 , Y = +50 ,用補碼運算求解X+
Y 。
【X】補 = 0110 0100 【Y】補 = 0011 0010
【-X】補 = 1001 1100 【-Y】補 = 1100 1110
【X+Y】補 = 0110 0100 + 0011 0010 = 1001 0110
【X+Y】原碼 = 【【X+Y】補 】補 = 1110 1010
X+Y = -(0110 1010)= -106 ≠ (+100) + (+50)
溢出的判別
計算機中判別溢出的方法通常採用雙高位判別法。雙高位判別法利用符號位(K n-1 位)及最高數值位(K n-2 位)的進位情況來判斷是否發生了溢出。爲此,需引進兩個符號::Cs 和 Cp.
Cs:若符號位發生進位,則Cs = 1; 否則Cs = 0
Cp:若最高數值位發生進位,則Cp = 1;否則Cp = 0
● 當兩個正數補碼相加時,若數值部分之和大於2n-1,則數值部分必有進位Cp= 1;而符號位卻無進位Cs = 0。這時CsCp的狀態爲 “ 01 ” 發生正溢出。
● 當兩個負數補碼相加時,若數值部分絕對值之和大於2 n-1 ,則數值部分補碼之和必小於2 n-1, Cp = 0;而符號位肯定有進位Cs = 1,這時CsCp的狀態爲 “10“”, 發生負溢出。
● 當不發生溢出時,Cs和Cp的狀態是相同的,即Cs Cp的狀態爲 “00” 或 “11” 。
例三:
① 1001 0010 (-110) ② 1110 1100 (-20)
+ 1010 0100 (-92) + 1110 0010 (-30)
—————————————— ——————————————————
1 0011 0110 (+54) 1 1100 1110 (-50)
Cs = 1,Cp = 0, ==負溢出 Cs = 1, Cp = 1,==無溢出
綜上所述,對計算機而言,補碼的引入使帶符號數的運算都按加法處理。如果Cs和Cp的值相等,則表示運算結果正確,沒有溢出。如果Cs和Cp的值不等,則表示運算結果不正確,發生了溢出現象。