原碼、反碼、補(bǔ)碼

數(shù)值在計(jì)算機(jī)中是以補(bǔ)碼的方式存儲(chǔ)的,在探求為何計(jì)算機(jī)要使用補(bǔ)碼之前, 讓我們先了解原碼, 反碼和補(bǔ)碼的概念。

對(duì)于一個(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ù)是帶符號(hào)的,在計(jì)算機(jī)用一個(gè)數(shù)的最高位存放符號(hào), 正數(shù)為0, 負(fù)數(shù)為1。比如,十進(jìn)制中的數(shù) +2 ,計(jì)算機(jī)字長為8位,轉(zhuǎn)換成二進(jìn)制就是[00000010]。如果是 -2 ,就是 [10000010] 。因?yàn)榈谝晃皇欠?hào)位,所以機(jī)器數(shù)的形式值就不等于真正的數(shù)值。例如上面的有符號(hào)數(shù) [10000010],其最高位1代表負(fù),其真正數(shù)值是 -2 而不是形式值130([10000010]轉(zhuǎn)換成十進(jìn)制等于130)。所以將帶符號(hào)位的機(jī)器數(shù)對(duì)應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值。

原碼就是符號(hào)位加上真值的絕對(duì)值, 即用第一位表示符號(hào), 其余位表示值。
反碼的表示方法是:正數(shù)的反碼是其本身;負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變,其余各個(gè)位取反。
補(bǔ)碼的表示方法是:正數(shù)的補(bǔ)碼就是其本身;負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變, 其余各位取反, 最后+1。 (即在反碼的基礎(chǔ)上+1)

那么計(jì)算機(jī)為什么要使用補(bǔ)碼呢?

首先,根據(jù)運(yùn)算法則減去一個(gè)正數(shù)等于加上一個(gè)負(fù)數(shù), 即: 1-1 = 1+(-1), 所以計(jì)算機(jī)被設(shè)計(jì)成只有加法而沒有減法, 而讓計(jì)算機(jī)辨別”符號(hào)位”會(huì)讓計(jì)算機(jī)的基礎(chǔ)電路設(shè)計(jì)變得十分復(fù)雜,于是就讓符號(hào)位也參與運(yùn)算,從而產(chǎn)生了反碼。
  用反碼計(jì)算, 出現(xiàn)了”0”這個(gè)特殊的數(shù)值, 0帶符號(hào)是沒有任何意義的。 而且會(huì)有[0000 0000]和[1000 0000]兩個(gè)編碼表示0。于是設(shè)計(jì)了補(bǔ)碼, 負(fù)數(shù)的補(bǔ)碼就是反碼+1,正數(shù)的補(bǔ)碼就是正數(shù)本身,從而解決了0的符號(hào)以及兩個(gè)編碼的問題: 用[0000 0000]表示0,用[1000 0000]表示-128。
   注意-128實(shí)際上是使用以前的-0的補(bǔ)碼來表示的, 所以-128并沒有原碼和反碼。使用補(bǔ)碼, 不僅僅修復(fù)了0的符號(hào)以及存在兩個(gè)編碼的問題, 而且還能夠多表示一個(gè)最低數(shù)。 這就是為什么8位二進(jìn)制, 使用補(bǔ)碼表示的范圍為[-128, 127]。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。