數值在計算機中是以補碼的方式存儲的,在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。
對于一個數, 計算機要使用一定的編碼方式進行存儲。 原碼, 反碼, 補碼是計算機存儲一個具體數字的編碼方式。
一個數在計算機中的二進制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1。比如,十進制中的數 +2 ,計算機字長為8位,轉換成二進制就是[00000010]。如果是 -2 ,就是 [10000010] 。因為第一位是符號位,所以機器數的形式值就不等于真正的數值。例如上面的有符號數 [10000010],其最高位1代表負,其真正數值是 -2 而不是形式值130([10000010]轉換成十進制等于130)。所以將帶符號位的機器數對應的真正數值稱為機器數的真值。
- 原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值。
- 反碼的表示方法是:正數的反碼是其本身;負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反。
- 補碼的表示方法是:正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1。 (即在反碼的基礎上+1)
舉例:
十進制數 | 原碼 | 反碼 | 補碼 |
---|---|---|---|
85 | 0101 0101 |
0101 0101 |
0101 0101 |
-85 | 1101 0101 |
1010 1010 |
1010 1011 |
9 | 0000 1001 |
0000 1001 |
0000 1001 |
-9 | 1000 1001 |
1111 0110 |
1111 0111 |
那么計算機為什么要使用補碼呢?
首先,根據運算法則減去一個正數等于加上一個負數, 即: 1-1 = 1+(-1), 所以計算機被設計成只有加法而沒有減法, 而讓計算機辨別"符號位"會讓計算機的基礎電路設計變得十分復雜,于是就讓符號位也參與運算,從而產生了反碼。
用反碼計算, 出現了"0"這個特殊的數值, 0帶符號是沒有任何意義的。 而且會有[0000 0000]和[1000 0000]兩個編碼表示0。于是設計了補碼, 負數的補碼就是反碼+1,正數的補碼就是正數本身,從而解決了0的符號以及兩個編碼的問題: 用[0000 0000]表示0,用[1000 0000]表示-128。
注意-128實際上是使用以前的-0的補碼來表示的, 所以-128并沒有原碼和反碼。使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數。 這就是為什么8位二進制, 使用補碼表示的范圍為[-128, 127]。