最近看了一些文章說原碼、反碼、補(bǔ)碼。還有一些軟考的那些講師講解。直接說這樣背就沒有問題了。完全沒有解析背后的原理。下面就是軟考的其中一頁P(yáng)PT。寫得是沒錯(cuò),但是這樣背,很快就忘記了,我想從另外一個(gè)方向和你說。為什么會出現(xiàn)原碼、反碼和補(bǔ)碼?他們解決了什么東西。
其實(shí)出現(xiàn)這些都是為了方便表示一個(gè)負(fù)數(shù),而且在實(shí)現(xiàn)數(shù)的運(yùn)算的時(shí)間更簡單。現(xiàn)在計(jì)算機(jī)表示一個(gè)數(shù)都是用補(bǔ)碼,它解決了+0,-0的問題。
下面用4個(gè)比特位來表示數(shù)
原碼表示:最高位(MSB most significant bit)代表符號位,0為正,1為符。你會發(fā)現(xiàn)會有-0(0000),+0(1000),和我們平時(shí)生活當(dāng)中只有一個(gè)-0和+0是一樣的相違背。然后對一個(gè)數(shù)進(jìn)行加法。按我們正常的去做加法,你會發(fā)現(xiàn)會結(jié)果是錯(cuò)的。
原碼表示
明明+1 +(-1)=0,但是你看下面對應(yīng)的碼表是-2.如果想糾正這種結(jié)果也可以通常復(fù)雜的邏輯組件實(shí)現(xiàn)。看結(jié)果是不是有點(diǎn)反人性。所以計(jì)算機(jī)放棄使用這種表示一個(gè)數(shù)。
以原碼方式進(jìn)行加法
反碼表示:這個(gè)你是需要記的,反碼是將正數(shù)取反(也就是翻轉(zhuǎn)它所有位,在硬件層面就是進(jìn)行NOT運(yùn)算)。直接上圖。你會發(fā)現(xiàn)仍然存在一個(gè)+0(0000),-0(1111)的問題。
反碼表示
做加法是怎么操作的呢,使用循環(huán)進(jìn)位這種方法,如果加法在最高位有溢出,就從最低位加1.如果不理解你再多看一次加粗的話還有再看一次圖。如果沒有溢出就不用管,但是這樣還是比較麻煩,因?yàn)橐嘧鲆徊郊?的操作(我看《計(jì)算機(jī)系統(tǒng)解密》這書上說這樣操作加法麻煩,但是我覺得采取補(bǔ)碼的表示方法你本來也就要采取碼加1的做法,不也是多做了一步加1的操作嗎,怎么就說有更簡單的方法呢)。但是采取補(bǔ)碼運(yùn)算時(shí)方便了。
反碼加法
補(bǔ)碼表示:對正數(shù)取反,也就是對每一位進(jìn)行NOT運(yùn)算,然后加1,如果出現(xiàn)進(jìn)位溢出,那就丟棄。 你看0就是(0000),如果你按補(bǔ)碼的規(guī)則,0000取反就是 1111再加1就是[1]0000,其中1是溢出,那就丟棄,那還是0000,所以完美地0只有一種表示方法。而且原碼,反碼都出現(xiàn)了兩個(gè)0,補(bǔ)碼只有一個(gè)0,所以補(bǔ)碼能表示更多數(shù),多在能比補(bǔ)碼反碼多表示一個(gè)負(fù)數(shù)。
補(bǔ)碼表示
書中插圖那里我認(rèn)為不對,-1應(yīng)該是1111的表示。它想尋找一個(gè)-1的表示方法。就是什么數(shù)加1會等于0。0的表示方法和1的表示方法已經(jīng)規(guī)定了好了。所以在尋找一個(gè)-1的表示方法,然后就得出了補(bǔ)碼的規(guī)則。所以你知道為什么會出現(xiàn)這些不同碼的表示方法了吧。就是為了尋找一個(gè)高效的方法(排隊(duì)奇異,使運(yùn)算簡單)來表示一個(gè)負(fù)數(shù)。
補(bǔ)碼加法
現(xiàn)在你已經(jīng)了對原碼,反碼,補(bǔ)碼清楚了吧。當(dāng)你遺忘,你想想怎么表示一個(gè)負(fù)數(shù),能夠不出現(xiàn)+0,-0的現(xiàn)象。計(jì)算是使用補(bǔ)碼來表示的負(fù)數(shù)的。最后來做幾道題來結(jié)束吧。
(1)十進(jìn)制數(shù)-48用補(bǔ)碼表示為( )
A、10110000 B、11010000 C、11110000 D、11001111
(2)已知X、Y為兩個(gè)有符號數(shù)的定點(diǎn)整數(shù),它們的補(bǔ)碼為:[x]補(bǔ)=00010011B,[y]補(bǔ)=11111001B,則[X+Y]補(bǔ)= B
將你的答案寫在評論區(qū)。
轉(zhuǎn)載請注明來自夕逆IT,本文標(biāo)題:《反碼補(bǔ)碼計(jì)算器(計(jì)算機(jī)原碼反碼和補(bǔ)碼看了這一篇)》

還沒有評論,來說兩句吧...