1.真值和機器數:
一個十進制的數叫做真值,它在計算機中存儲的二進制形式的數叫做機器數。
2.真值數據的表示形式:
機器數有固定的位數,位數大小與計算機有關,通常為8位或者16位。以8位為例,最高位表示正負,0代表正,1代表負。例如10000011表示的數字是-3,最高位的1代表負號。
3.原碼:
除了最高位的符號位外,其他7位是數值位即一個十進制數字的二進制表示方法。
例如:
符號位 0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
表示的數字是:1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2^0=127
4.反碼:
正數的反碼與原碼相同
符號位 0(原碼) |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
符號位0(反碼) |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
負數的反碼是除了符號位,其他位0變為1,1變為0;
符號位 1 (原碼) |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
符號位1(反碼) |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
5.補碼:
正數的補碼與原碼相同
符號位 0(原碼) |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
符號位0(補碼) |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
負數的補碼是在其反碼的最低位加1。其他位滿足滿2進1的計算原則
符號位 1(原碼) |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
符號位 1(反碼) |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
符號位 1(補碼) |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
6.補碼的意義:
計算十進制的表達式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原碼表示, 讓符號位也參與計算, 顯然對於減法來說, 結果是不正確的.這也就是為何計算機內部不使用原碼表示一個數.
為了解決原碼做減法的問題, 出現了反碼:
計算十進制的表達式: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
發現用反碼計算減法, 結果的真值部分是正確的. 而唯一的問題其實就出現在"0"這個特殊的數值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符 號是沒有任何意義的. 而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0。於是補碼的出現, 解決了0的符號以及兩個編碼的問題:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原
而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000 0000]補
-1-127的結果應該是-128, 在用補碼運算的結果中, [1000 0000]補 就是-128. 但是注意因為實際上是使用以前的-0的補碼來表 示-128, 所以-128並沒有原碼和反碼表示.(對-128的補碼表示[1000 0000]補算出來的原碼是[0000 0000]原, 這是不正確的)
使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數. 這就是為什么8位二進制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補碼表示的范圍為[-128, 127].