其實吧,在我們學習C語言中會遇到好多令人頭疼的問題,比如說,原碼,反碼,補碼。看見很簡單的三個詞,可是真正理解起來會非常的麻煩,那麼我在這裏就跟大家一起來重新學習一下原碼,反碼,補碼。
首先讓我們弄明白,什麼是原碼,什麼是反碼,什麼是補碼,要想學會這個,我們首先要弄明白他們的定義。
所謂的原碼,就是指有符號的整數的二進制。原碼本身簡單一易懂在這裏就不做過多的解釋
例如:
00000001=1
10000001=-1
反碼,就是把原碼的符號位不變其餘的位進行取反。最高位還是一樣,當爲1的時候是正,當爲0的時候是負。對於正數來說,正數的反碼跟原碼是相同的,對於負數來說,符號位是保持不變其餘位置進行取反操作,
例如:
正數100的原碼爲:01100100 則100的反碼也爲:01100100
負數100的原碼爲:11100100 則它的反碼爲:10011011
此時需要注意:0也有兩種表現形式。
說起來反碼理解相對而言還算簡單,那麼接下來讓我們繼續學習補碼
補碼,對於正數來說,補碼跟原碼是相同的,對於負數而言,符號位還是保持不變,其數值位x的據對峙取反後再最低位+1。在計算機中的儲存都是用補碼來處理的
例如:
+9的原碼是:00001001 +9的反碼爲00001001 +9的補碼爲00001001
-9的原碼是:10001001 -9的反碼爲11110110 -9的補碼爲11110111
注意:在補碼中0有唯一的編碼。
補碼的絕對值之爲真值;
以上呢,爲原碼、反碼、補碼的簡單介紹,綜上所述我們對於原碼、反碼、補碼的理解,我認爲是相當簡單了,那接下來我們看一下他們在實際中的應用,大部分爲舉例分析
原碼的符號位不能直接參與運算,必須和其他位分開。在原碼的具體定義中還分爲小數和正數
1.小數原碼的定義
+0.1011的原碼就是0.1011 -0.1011的原碼就是 1.1011
2.正數原碼的定義(略 前面提起過)
注意,在小數原碼的定義時候,代碼中的小數點並不會出現在機器內部
反碼
在上面提到的數0的反碼有兩種形式
如下:
+0的反碼爲:00000000
-0的反碼爲:11111111
八位二進制反碼的表示範圍爲-128~+127
補碼
在補碼中,我們會提到模,那麼什麼叫做模呢?
模的定義:把一個計量單位稱之爲模或者模數。例如,時鐘是以12進制計數循環的,即以12爲模。利用模的概念可以把計算的減法變爲加法。同理,計算機的運算部件與寄存器都有一定字長的限制(假設字長爲8),因此它的運算也是一種模運算。當計數器計滿8位也就是256個數後會產生溢出,又從頭開始計數。產生溢出的量就是計數器的模,顯然,8位二進制數,它的模數爲2^8=256。在計算中,兩個互補的數稱爲“補碼”
補碼在微型機中是一種重要的編碼形式,請注意:
1.採用補碼後,可以方便的將減法運算轉化成加法運算,運算過程得到簡化。
2.與原碼、反碼不同,數值0的補碼只有一個,即000000000B
3.若字長爲8位,則不嗎所表示的範圍爲-128~127;進行補碼運算時,應注意所得到結果不應超過補碼所表示數的範圍
下面我們進行一個簡單的轉化案例:
已知原碼,求反碼跟補碼,原碼爲10110110B,求出反碼和補碼
有已知可以知道10110110B爲一個負數
則反碼爲11001001B
它的補碼就爲11001010B(從末端+1的到補碼)