數(shù)值在計算機中是以補碼的方式存儲的褥影,在探求為何計算機要使用補碼之前池户, 讓我們先了解原碼, 反碼和補碼的概念凡怎。
對于一個數(shù)校焦, 計算機要使用一定的編碼方式進行存儲。 原碼统倒, 反碼寨典, 補碼是計算機存儲一個具體數(shù)字的編碼方式。
一個數(shù)在計算機中的二進制表示形式房匆, 叫做這個數(shù)的機器數(shù)耸成。機器數(shù)是帶符號的报亩,在計算機用一個數(shù)的最高位存放符號, 正數(shù)為0井氢, 負數(shù)為1弦追。比如,十進制中的數(shù) +2 花竞,計算機字長為8位劲件,轉(zhuǎn)換成二進制就是[00000010]。如果是 -2 约急,就是 [10000010] 零远。因為第一位是符號位,所以機器數(shù)的形式值就不等于真正的數(shù)值烤宙。例如上面的有符號數(shù) [10000010]遍烦,其最高位1代表負,其真正數(shù)值是 -2 而不是形式值130([10000010]轉(zhuǎn)換成十進制等于130)躺枕。所以將帶符號位的機器數(shù)對應(yīng)的真正數(shù)值稱為機器數(shù)的真值服猪。
- 原碼就是符號位加上真值的絕對值, 即用第一位表示符號拐云, 其余位表示值罢猪。
- 反碼的表示方法是:正數(shù)的反碼是其本身;負數(shù)的反碼是在其原碼的基礎(chǔ)上叉瘩, 符號位不變膳帕,其余各個位取反。
- 補碼的表示方法是:正數(shù)的補碼就是其本身薇缅;負數(shù)的補碼是在其原碼的基礎(chǔ)上危彩, 符號位不變, 其余各位取反泳桦, 最后+1汤徽。 (即在反碼的基礎(chǔ)上+1)
舉例:
十進制數(shù) | 原碼 | 反碼 | 補碼 |
---|---|---|---|
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 |
那么計算機為什么要使用補碼呢?
首先灸撰,根據(jù)運算法則減去一個正數(shù)等于加上一個負數(shù)谒府, 即: 1-1 = 1+(-1), 所以計算機被設(shè)計成只有加法而沒有減法浮毯, 而讓計算機辨別"符號位"會讓計算機的基礎(chǔ)電路設(shè)計變得十分復(fù)雜完疫,于是就讓符號位也參與運算,從而產(chǎn)生了反碼债蓝。
用反碼計算壳鹤, 出現(xiàn)了"0"這個特殊的數(shù)值, 0帶符號是沒有任何意義的饰迹。 而且會有[0000 0000]和[1000 0000]兩個編碼表示0芳誓。于是設(shè)計了補碼讯嫂, 負數(shù)的補碼就是反碼+1,正數(shù)的補碼就是正數(shù)本身兆沙,從而解決了0的符號以及兩個編碼的問題: 用[0000 0000]表示0欧芽,用[1000 0000]表示-128。
注意-128實際上是使用以前的-0的補碼來表示的葛圃, 所以-128并沒有原碼和反碼千扔。使用補碼, 不僅僅修復(fù)了0的符號以及存在兩個編碼的問題库正, 而且還能夠多表示一個最低數(shù)曲楚。 這就是為什么8位二進制, 使用補碼表示的范圍為[-128褥符, 127]龙誊。