??在大學(xué)學(xué)習(xí)很多計(jì)算機(jī)課程時号醉,第一章節(jié)總會遇到原碼悉抵、反碼岭皂、補(bǔ)碼這哥仨茬贵,再后面就完全見不到了簿透,當(dāng)時只是跟著書上的方法去計(jì)算,也不知道這玩意算出來是干啥的解藻,為什么要引入這哥仨老充。本文就是從說明原碼、反碼螟左、補(bǔ)碼的引入原因來解釋這三個名詞蚂维,所以介紹的順序與大學(xué)課本有所不同戳粒,本文的介紹順序是原碼、補(bǔ)碼虫啥、反碼蔚约,望知悉。
一涂籽、背景
??大家都知道苹祟,在計(jì)算機(jī)內(nèi)部,數(shù)據(jù)都是以二進(jìn)制的方式存儲運(yùn)算的评雌,為什么采用二進(jìn)制而不采用大家熟悉的十進(jìn)制树枫?因?yàn)槎M(jìn)制最簡單、最好實(shí)現(xiàn)景东,只要一個事物具有兩種對立狀態(tài)都可以作為二進(jìn)制思想的實(shí)現(xiàn)砂轻,比如使用元件開關(guān)特性、電壓高低特性即可實(shí)現(xiàn)斤吐。
??根據(jù)馮諾依曼提出的經(jīng)典計(jì)算機(jī)體系結(jié)構(gòu)框架搔涝。一臺計(jì)算機(jī)由運(yùn)算器,控制器和措,存儲器庄呈,輸入和輸出設(shè)備組成。其中運(yùn)算器派阱,只有加法運(yùn)算器诬留,沒有減法運(yùn)算器(據(jù)說一開始是有的,后來由于減法器硬件開銷太大贫母,被廢了 )
所以文兑,計(jì)算機(jī)中是無法直接做減法的,它的減法是通過加法來實(shí)現(xiàn)的腺劣。你也許會說彩届,現(xiàn)實(shí)世界中所有的減法也可以當(dāng)成加法的,減去一個數(shù)誓酒,可以看作加上這個數(shù)的相反數(shù)。當(dāng)然沒錯贮聂,但是前提是要先有負(fù)數(shù)的概念靠柑。這就為什么不得不引入一個該死的符號位。由此吓懈,人們發(fā)明了原碼表示法歼冰。
二、原碼表示法
1耻警、計(jì)算方法
原碼:用最高位表示符號位隔嫡,‘1’表示負(fù)號甸怕,‘0’表示正號。其他位存放該數(shù)的二進(jìn)制的絕對值腮恩。
2梢杭、說明
若以帶符號的四位二進(jìn)制數(shù)為例:
1010 : 最高位為‘1’,表示這是一個負(fù)數(shù),其他三位為‘010’秸滴,即(0*2^2)+(1*2^1)+(0*2^0)=2(‘^’表示冪運(yùn)算符)武契。所以1010表示十進(jìn)制數(shù)(-2)。
下圖給出部分正負(fù)數(shù)數(shù)的二進(jìn)制原碼表示法:
OK荡含,原碼表示法很簡單有沒有咒唆,雖然出現(xiàn)了+0和-0,但是直觀易懂释液。
于是全释,我們高興的開始運(yùn)算。
0001+0010=0011 (1+2=3)OK
0000+1000=1000 (+0+(-0)=-0) 額误债,問題不大
0001+1001=1010 (1+(-1)=-2)
what? 1+(-1)=-2浸船,逗我玩的吧?
如果采用原碼表示法找前,看來是不能這樣簡單的做加法運(yùn)算的糟袁,必須這樣處理:當(dāng)兩數(shù)相加時,如果是同號則數(shù)值相加躺盛;如果是異號项戴,則要進(jìn)行減法。而在進(jìn)行減法時槽惫,還要先比較絕對值的大小周叮,然后大數(shù)減去小數(shù),最后還要給結(jié)果選擇恰當(dāng)?shù)姆枴?br>
如果這樣去實(shí)現(xiàn)界斜,太復(fù)雜了吧仿耽,有沒有簡單點(diǎn)的方法,于是人們找到了補(bǔ)碼表示法各薇。
三项贺、補(bǔ)碼表示法
1、實(shí)現(xiàn)思想
藝術(shù)源于生活
其實(shí)人類的很多發(fā)明創(chuàng)意都是來源于生活峭判,例如魯班根據(jù)有齒的小草發(fā)明了鋸开缎、意大利發(fā)明家博列里通過對魚類的觀察發(fā)明了潛水艇、科學(xué)家根據(jù)蜻蜓飛行結(jié)構(gòu)研制出了直升飛機(jī)等等林螃。補(bǔ)碼的思想源于時鐘的運(yùn)動奕删。
假設(shè)現(xiàn)在的標(biāo)準(zhǔn)時間為4點(diǎn)整,而有一只表已經(jīng)7點(diǎn)了疗认,為了校準(zhǔn)時間完残,可以采用兩種方法:一是將時針退7-4=3格伏钠;一是將是針向前撥12-3=9格。這兩種方法都能對準(zhǔn)到4點(diǎn)谨设,由此看出熟掂,減3和加9是等價的。就是說9是(-3)對12的補(bǔ)碼铝宵,可以用數(shù)學(xué)公式表示為:
-3 = +9 ?? (mod 12)
mod 12的意思就是12為模數(shù)打掘,這個“模”表示被丟掉的數(shù)值鹏秋。上式在數(shù)學(xué)上稱為同余式尊蚁。
上例中之所以7-3和7+9(mod 12)等價,原國就是表指針超過12時侣夷,將12自動丟掉横朋,最后得到16-12=4。
由此得到一個啟發(fā)百拓,就是負(fù)數(shù)用補(bǔ)碼表示時琴锭,可以把減法轉(zhuǎn)化為加法。這樣衙传,在計(jì)算機(jī)中實(shí)現(xiàn)起來就比較方便决帖。
采用補(bǔ)碼表示法進(jìn)行減法運(yùn)算比原碼方便多了。因?yàn)椴徽摂?shù)是正或負(fù)蓖捶,機(jī)器總是做加法地回,減法運(yùn)算可變成加法運(yùn)算。但根據(jù)補(bǔ)碼定義俊鱼,求負(fù)數(shù)的補(bǔ)碼還要做減法這顯然不方便刻像,為此可通過反碼來解決。
2并闲、計(jì)算方法
補(bǔ)碼:正數(shù)的補(bǔ)碼等于他的原碼
???負(fù)數(shù)的補(bǔ)碼等于反碼+1细睡。(反碼的知識見下一小節(jié))
下圖給出部分帶符號位四位二進(jìn)制的補(bǔ)碼表示法
根據(jù)上面的補(bǔ)碼圖,我們可以做幾道運(yùn)算(下面運(yùn)算中括號中為十進(jìn)制):
0001(1)+ 1111(-1)= 0000(0)
1111(-1)+1110(-2)= 1101(-3)
至此帝火,我們發(fā)現(xiàn)減法的問題解決了溜徙,正0、負(fù)0的問題也解決了犀填,計(jì)算機(jī)可以很容易只通過加法來計(jì)算加減運(yùn)算了蠢壹。
四、反碼表示法
1宏浩、計(jì)算方法
反碼:正數(shù)的反碼還是等于原碼
???負(fù)數(shù)的反碼就是他的原碼除符號位外,按位取反靠瞎。
2比庄、說明
反碼的引入主要是為了解決計(jì)算一個負(fù)數(shù)的補(bǔ)碼求妹。
若以帶符號的四位二進(jìn)制數(shù)為例:
3是正數(shù),反碼與原碼相同佳窑,則可以表示為0011
-3的原碼是1011制恍,符號位保持不變,低三位(011)按位取反得(100)神凑,所以-3的反碼為1100
下圖給出部分正負(fù)數(shù)的二進(jìn)制數(shù)反碼表示法
負(fù)數(shù)的反碼加上這個負(fù)數(shù)的絕對值正好等于1111净神,再加1,就是1000溉委,也就是四位二進(jìn)數(shù)的模鹃唯。而負(fù)數(shù)的補(bǔ)碼是它的絕對值的同余數(shù),可以通過模減去負(fù)數(shù)的絕對值瓣喊,得到他的補(bǔ)碼坡慌。
所以 負(fù)數(shù)的補(bǔ)碼就是它的反碼+1。
總結(jié)
1藻三、原碼的引入是由于計(jì)算機(jī)是采用二進(jìn)制來運(yùn)算和存儲的洪橘,補(bǔ)碼的引入主要是為了解決負(fù)數(shù)的運(yùn)算的,而反碼的引入是為了方便計(jì)算補(bǔ)碼棵帽。
2熄求、計(jì)算機(jī)中所有數(shù)據(jù)都是以補(bǔ)碼的形式存儲、計(jì)算的逗概。