首先我們得先把源碼、反碼、補碼的概念搞清楚,然後對比三碼的區別,再總結爲什麼計算機內存數值存儲方式是補碼。
1. 原碼
一個數的原碼(原始的二進制碼)有如下特點:
- 最高位做爲符號位,0表示正,爲1表示負
- 其它數值部分就是數值本身絕對值的二進制數
- 負數的原碼是在其絕對值的基礎上,最高位變爲1
下面數值以1字節的大小描述:
十進制數 | 原碼 |
---|---|
+15 | 0000 1111 |
-15 | 1000 1111 |
+0 | 0000 0000 |
-0 | 1000 0000 |
原碼錶示法簡單易懂,與帶符號數本身轉換方便,只要符號還原即可,但當兩個正數相減或不同符號數相加時,必須比較兩個數哪個絕對值大,才能決定誰減誰,才能確定結果是正還是負,所以原碼不便於加減運算。
2. 反碼
- 對於正數,反碼與原碼相同
- 對於負數,符號位不變,其它部分取反(1變0,0變1)
十進制數 | 反碼 |
---|---|
+15 | 0000 1111 |
-15 | 1111 0000 |
+0 | 0000 0000 |
-0 | 1111 1111 |
反碼運算也不方便,通常用來作爲求補碼的中間過渡。
3. 補碼
補碼特點:
- 對於正數,原碼、反碼、補碼相同
- 對於負數,其補碼爲它的反碼加1
- 補碼符號位不動,其他位求反,最後整個數加1,得到原碼
十進制數 | 補碼 |
---|---|
+15 | 0000 1111 |
-15 | 1111 0001 |
+0 | 0000 0000 |
-0 | 0000 0000 |
4. 補碼的意義
示例1:用8位二進制數分別表示+0和-0
十進制數 | 原碼 |
---|---|
+0 | 0000 0000 |
-0 | 1000 0000 |
十進制數 | 反碼 |
---|---|
+0 | 0000 0000 |
-0 | 1111 1111 |
不管以原碼方式存儲,還是以反碼方式存儲,0也有兩種表示形式。爲什麼同樣一個0有兩種不同的表示方法呢?
但是如果以補碼方式存儲,補碼統一了零的編碼:
十進制數 | 補碼 |
---|---|
+0 | 0000 0000 |
-0 | 10000 0000 由於只用8位描述,最高位1丟棄,變爲0000 0000 |
示例2:計算9-6的結果
以原碼方式相加:
十進制數 | 原碼 |
---|---|
9 | 0000 1001 |
-6 | 1000 0110 |
結果爲-15,不正確。
以補碼方式相加:
十進制數 | 補碼 |
---|---|
9 | 0000 1001 |
-6 | 1111 1010 |
最高位的1溢出,剩餘8位二進制表示的是3,正確。
在計算機系統中,數值一律用補碼來存儲,主要原因是:
- 統一了零的編碼
- 將符號位和其它位統一處理
- 將減法運算轉變爲加法運算
- 兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄