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

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