數(shù)值在計(jì)算機(jī)中是以補(bǔ)碼的方式存儲(chǔ)的,在探求為何計(jì)算機(jī)要使用補(bǔ)碼之前坚洽, 讓我們先了解原碼戈稿, 反碼和補(bǔ)碼的概念。
對于一個(gè)數(shù)讶舰, 計(jì)算機(jī)要使用一定的編碼方式進(jìn)行存儲(chǔ)鞍盗。 原碼, 反碼跳昼, 補(bǔ)碼是計(jì)算機(jī)存儲(chǔ)一個(gè)具體數(shù)字的編碼方式般甲。
一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制表示形式, 叫做這個(gè)數(shù)的機(jī)器數(shù)鹅颊。機(jī)器數(shù)是帶符號的敷存,在計(jì)算機(jī)用一個(gè)數(shù)的最高位存放符號, 正數(shù)為0堪伍, 負(fù)數(shù)為1锚烦。比如,十進(jìn)制中的數(shù) +2 帝雇,計(jì)算機(jī)字長為8位涮俄,轉(zhuǎn)換成二進(jìn)制就是[00000010]。如果是 -2 尸闸,就是 [10000010] 彻亲。因?yàn)榈谝晃皇欠栁辉谐詸C(jī)器數(shù)的形式值就不等于真正的數(shù)值。例如上面的有符號數(shù) [10000010]苞尝,其最高位1代表負(fù)畸肆,其真正數(shù)值是 -2 而不是形式值130([10000010]轉(zhuǎn)換成十進(jìn)制等于130)。所以將帶符號位的機(jī)器數(shù)對應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值野来。
原碼就是符號位加上真值的絕對值恼除, 即用第一位表示符號, 其余位表示值曼氛。
反碼的表示方法是:正數(shù)的反碼是其本身豁辉;負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號位不變舀患,其余各個(gè)位取反徽级。
補(bǔ)碼的表示方法是:正數(shù)的補(bǔ)碼就是其本身;負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上聊浅, 符號位不變餐抢, 其余各位取反, 最后+1低匙。 (即在反碼的基礎(chǔ)上+1)
那么計(jì)算機(jī)為什么要使用補(bǔ)碼呢旷痕?
首先,根據(jù)運(yùn)算法則減去一個(gè)正數(shù)等于加上一個(gè)負(fù)數(shù)顽冶, 即: 1-1 = 1+(-1)欺抗, 所以計(jì)算機(jī)被設(shè)計(jì)成只有加法而沒有減法, 而讓計(jì)算機(jī)辨別”符號位”會(huì)讓計(jì)算機(jī)的基礎(chǔ)電路設(shè)計(jì)變得十分復(fù)雜强重,于是就讓符號位也參與運(yùn)算绞呈,從而產(chǎn)生了反碼。
用反碼計(jì)算间景, 出現(xiàn)了”0”這個(gè)特殊的數(shù)值佃声, 0帶符號是沒有任何意義的。 而且會(huì)有[0000 0000]和[1000 0000]兩個(gè)編碼表示0倘要。于是設(shè)計(jì)了補(bǔ)碼圾亏, 負(fù)數(shù)的補(bǔ)碼就是反碼+1,正數(shù)的補(bǔ)碼就是正數(shù)本身碗誉,從而解決了0的符號以及兩個(gè)編碼的問題: 用[0000 0000]表示0召嘶,用[1000 0000]表示-128。
注意-128實(shí)際上是使用以前的-0的補(bǔ)碼來表示的哮缺, 所以-128并沒有原碼和反碼弄跌。使用補(bǔ)碼, 不僅僅修復(fù)了0的符號以及存在兩個(gè)編碼的問題尝苇, 而且還能夠多表示一個(gè)最低數(shù)铛只。 這就是為什么8位二進(jìn)制埠胖, 使用補(bǔ)碼表示的范圍為[-128, 127]淳玩。