詳解原碼、反碼以及補碼

很多人都只知道計算機使用的是二進制,但很少有人瞭解計算機是以補碼的方式進行存儲數據的,之所以使用補碼而不是直接使用二進制實際是爲了解決正負運算的問題。

5在二進制中表示爲101B(B爲二進制單位),如果是在32位計算機中,我們高位補零:

00000000 00000000 00000000 00000101

這個就可以用來在32位計算機中表示數字5,但是如果我們需要表示-5呢?這個時候就出現問題了,因爲計算機中沒有正負只有0和1,那麼要怎麼表示-5呢?二進制是沒辦法直接表示-5的,爲了解決這個問題原碼就誕生了。

原碼:最高位爲0爲正,1爲負,也就是說原碼中的正數是一致的,只有爲負數時最高位會爲1,那麼5和-5分別表示爲:

00000000 00000000 00000000 00000101 //爲5

10000000 00000000 00000000 00000101 //爲-5

計算機中並沒有減運算,減運算實際是加一個負數的運算,這也就是爲什麼正數之間的加運算會比減運算快的原因,減運算需要做更多的處理來讓計算機解讀成能理解的加運算,例如5-5計算機要處理成5+(-5),原碼在高位用0和1解決了區分正負的問題,但是又引來的新的問題,因爲我們都知道5+(-5)是等於0的,但是我們來看看原碼之間的運算結果:

00000000 00000000 00000000 00000101+10000000 00000000 00000000 00000101

=10000000 00000000 00000000 00001010

10000000 00000000 00000000 00001010的原碼並不是我們期待的0,而是-10,5+(-5)=-10這肯定不是我們要的結果,不僅如此原碼正數高位爲0,所有負數高位爲1,這個時候會出現兩個0的情況,一個爲正0,一個爲負0,這顯然不太合理,0是沒有正負的,爲了解決第一個問題後來又引入了一個新的概念,那就是反碼。


反碼:反碼是在原碼的基礎上進一步改進,正數還是同原碼及普通二進制一致,但負數則根據該負數的絕對值,也就是正數的原碼進行翻轉,如果是0就變成1,如果是1則變爲0,顧名思義爲反碼,反碼的出現是爲了解決正負數的運算問題。

這裏實際上是運用了模的概念,例如時鐘裏的模是12,時鐘只有0-11,到12就溢出重新變爲0,而在模爲12的情況下,要6變爲2有兩種方法,一種是-4,一種是+8,而4和8又互爲補數。

這正好可以解決計算正負號運算問題,因爲計算機可以看作計量機器,例如32位計算機的計量範圍是0~2^(32)-1,而模是2^(32),這樣計算機的正負號運算就可以運用模的性質轉化爲兩個正數相加來達到和正數減去負數一樣的結果,從減一個負數變爲加這個負數的補數。

從二進制可以輕鬆的看出,一個正數和自身對應的負數的反碼互爲補數,因此減去該正數和加上該正數對應的負數的反碼結果是一樣的。

例如5和-5

00000000 00000000 00000000 00000101 //正數5和上面原碼及普通二進制一樣的表示

11111111 11111111 11111111 11111010 //-5的反碼是5的二進制(或者說原碼、反碼都可以,因爲都一樣)0和1的反轉

00000000 00000000 00000000 00000101+11111111 11111111 11111111 11111010 

=11111111 11111111 11111111 11111111

這裏的11111111 11111111 11111111 11111111是00000000 00000000 00000000 00000000的反碼,所以是-0,這樣反碼的出現就解決了正負數字的運算問題,但是還存在一個問題,就是上面的0是兩個,一個爲正0,全爲0,一個爲負0,全爲1。爲了解決這個問題,又引入了補碼的概念。


補碼:補碼的正數和反碼以及原碼、普通二進制的一致,沒有區別,而負數實際是在原有負數的反碼上面+1。

5的反碼:00000000 00000000 00000000 00000101

5的補碼:00000000 00000000 00000000 00000101


-5的反碼:11111111 11111111 11111111 11111010

-5的補碼:11111111 11111111 11111111 11111011 //就是在-5的反碼基礎上+1


00000000 00000000 00000000 00000101+11111111 11111111 11111111 11111011 

=00000000 00000000 00000000 00000000  //5的補碼+(-5的補碼)=0且0沒有正負號


從上面的解釋也可以看出來爲什麼計算機存儲數據使用補碼而不是直接用二進制,因爲二進制不能表示負數,而原碼雖然能表示負數,但無法進行正負數運算及兩個0的問題,反碼解決正負數運算的問題然後還保留着兩個0的問題,只有補碼完美解決了正負數運算問題同時還解決了兩個不同符號的0的問題,因此對於計算機而言,補碼是存儲的最佳選擇。











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章