數據在計算機中的存儲並非我們在物理世界見到的那樣,由於計算機只能存儲二進制數,因此需要將十進制數轉換成二進制數再進行存儲,而轉換後的二進制數的運算也面臨許多問題,因此引入了反碼和補碼的概念!
在微機中,凡是有符號數都是採用補碼錶示,所以運算的結果也是用補碼錶示的。
爲什麼引入補碼的概念呢?
因爲在計算機中,對於二進制的算術運算可以將乘法運算轉換爲加法和左移運算,而除法則可轉換爲減法和右移運算,故加、減、乘、除運算最終可歸結爲加、減和位移 3種 操作來完成。
但在計算機中爲了節省設備,一般只設置加法器而無減法器,這就需要將減法運算轉化爲加法運算,從而使計算器中的二進制四則運算最終變成加法和位移兩種操作。
引入補碼運算就是用來解決將減法運算轉化爲加法運算的。
數據的表示:基數 & 權
無論哪一種進制數的表示,都是由 基數和權的組合,
計算機中的符號數有3種表示方法,即 源碼、反碼、補碼,它們均是由符號位和數值部分組成;
- 符號位的表示方法相同:即 1表示負數,0表示 正數;
1、原碼
-
機器數的最高位爲符號位:0表示正號,1表示負號,其他部分是數的絕對值;
-
源碼錶示中的 0 有兩種不同的表示形式,即 +0 和 -0;
-
原碼錶示法的優點是:簡單、易於理解,與真值間的轉換較爲方便,用原碼實現乘除運算的規則比較簡單;
-
原碼錶示法的優點是:進行加減運算時比較麻煩,要比較加減運算的兩個數的符號、兩個數的絕對值的大小,還要確定運算結果的正確的符號等;
2、反碼
真值 X 的反碼記爲 。
- 對於正數而言,其表示方法同原碼一樣,即數值部分與真值相同;
- 對於負數而言,其反碼的數值部分爲真值的各位按位取反;
反碼的性質:
-
在反碼錶示法中,機器數的最高位是符號位,0表示正數,1表示負號;
-
反碼運算很不方便,數值 0 的表示也不唯一,因此在處理器中很少使用;
-
同原碼一樣,數0 也有兩種表示形式;
3、補碼
真值 X 的補碼記爲 。
-
與原碼和反碼的表示法相同,機器數的最高位是符號位,0表示正號,1表示負號;
-
正數的補碼與它的原碼相同;而反碼的補碼等於其符號位不變,數值部分的各位按位取反 再加1;
-
數 0 的補碼錶示法是唯一的;
SO -
對於8進制數而言,其取值範圍是 -128 —+127;
4、補碼的運算
- 補碼的加法規則:
- 補碼的減法規則:
注:
稱爲對補碼數 求變補;
變補的規則爲:
- 對 的每一位(包括符號位)按位取反加 1,則結果就是 。
- 當然,也可以直接對 求補碼,結果是一樣的。
有符號數運算時的溢出判斷
咋兩個有符號數進行加減運算時,如果運算結果超出上述可表示的有效範圍,就會發生溢出,使計算結果出錯。
判斷有符號數相加或異符號數相減時:
- 如果次高位向最高位有進位(借位),而最高位向上無進位(借位),則結果發生溢出;
- 反過來,如果次高位向最高位無進位(借位),而最高位向上有進位(借位),則結果也發生溢出;
對於 8位 二進制數,若 位產生的 進位(借位)記爲 , 位產生的進位(借位)記爲 ,那麼:
- 在兩個帶符號二進制數相加或相減時,若 則結果產生溢出( 是異或);
無符號數 與 有符號數產生溢出的條件因各自可表示數的範圍不同而不同。 - 無符號數的溢出判斷僅看最高位向上是否有進位(借位);
- 有符號數的溢出判斷需要看次高位和最高位 兩位的進位(借位)情況;
兩位都產生進位(借位)或都沒有產生進位(借位),則結果無溢出;
其中只有一位產生了進位(借位),則結果產生溢出,計算結果不正確;
運算時產生溢出,其結果肯定不正確,計算機對溢出的處理,一般是產生一箇中斷,通知用戶採取某種措施;