1)討論原碼之前首先需要了解兩個概念:機器數和真值。
a.乙個數值在計算機中的二進位制表示形式,就稱為這個數值的機器數。機器數是帶符號的,其中最高位是符號位,1表示負數,0表示正數。比如,
1100 0000就是-64的機器數,即在計算機中的二進位制表示形式。同樣的,0100 0000就是64的機器數。
b.真值:因為第一位是符號位,所以機器數的形式值並不是真正的數值。機器數中除符號位之外的二進位制串表示的才是真值(當然要加上符號才是真正的值)。
2)對於乙個數,在計算機中如何表示呢?這就涉及到對其的編碼問題,原碼、反碼、補碼就是計算機中對數的三種編碼方式。
a.原碼就類似於上述機器數的定義方式,乙個數的原碼就是符號位加上真值的絕對值,即第一位表示符號位,其餘位表示值。
-64的原碼就是:1100 0000
+64的原碼就是:0100 0000
計算機中只有加法器沒有減法器,減法運算是轉化為加法來進行的。以下舉例說明使用原碼進行加減法的過程:
64+64=0100 0000 + 0100 0000=0 1000 0000=128
64-64=64+(-64)=0100 0000+ 1100 0000=1 0000 0000=-0
1-1=1+(-1)=0000 0001 + 1000 0001=1000 0010=-2 計算錯誤
原碼的表示方式存在的問題:
1.存在+0、-0的情況(0000 1000)
2.進行減法運算的時候,有些情況會計算出錯(1-1=-2)
b.為了解決減法運算會出錯的情況,引入了反碼的編碼形式。對於正數,其反碼與原碼完全相同(原碼表示下,加法是正確的,所以正數的反碼保持與原碼相同即可),而負數的反碼是保持原碼的符號位不變,所有位依次取反,就得到反碼。以下分別給出+1,-1的反碼形式,並使用反碼進行減法運算:
+1=[0000 0001]
-1=[1111 1110]
1-1=1+(-1)=0000 0001+1111 1110=1111 1111,結果是反碼形式,需要將其轉化為原碼形式才能得到確切值,原碼是1000 0000=-0。
但是反碼對於0的表示方法任然是有兩種,這裡以4 bit為例:
0000 +0
1111 -0
c.採用了反碼的形式之後,減法運算的結果是正確了的。不過對於0還是存在+0、-0的情況。為了解決這個問題,補碼出現了。正數的補碼就是其原碼自身,負數的補碼是在其反碼的基礎上+1。還是以+1、-1的補碼形式說明:
+1=0000 0001
-1=1111 1111
1-1=1+(-1)=1 0000 0000 丟掉最高位=0000 0000=0(正數的補碼和原碼相同,所以是0)。
使用補碼不僅解決了+0、-0的情況,而且還可以多表示乙個最低數。下圖以4 bit為例,說明了原碼、反碼、補碼的」進化過程「:
(參考:
以下討論原碼和補碼兩種編碼形式下,表示的取值範圍。從上圖易知,分別使用原碼和補碼,4 bits的取值範圍是:
原碼:[-7,7](包含+0、-0)
補碼:[-8,7](只有乙個0)
兩種編碼方式都表示了16個數值,只是原碼有+0、-0之分,而補碼只有乙個0(+0),沒有-0,因此可多表示乙個最小值-8。-8的補碼推倒過程如下:
-1-7=1111+1001=1000=-8,所以-8的補碼是1000,其沒有對應的反碼和原碼。
而8 bits的範圍是:
補碼:[-128,127] 1000 0000=-128
因此對於n bits分別以原碼、補表示的數值取值範圍是:
原碼:[-(2^(n-1)-1),2^(n-1)-1
] 有1
個符號位,所以是n-1
補碼:[-(2^(n-1)),2^(n-1)-1]
3)計算機中是以補碼的形式表示數值的(起碼是整數),程式語言也是以補碼的形式表示數值的。
根據負數的原碼求補碼有乙個比較簡單的計算方法:符號位保持不變。從最低位開始,直至遇到第乙個1之前,之前的所有位保持不變。遇到第乙個1之後,保留這個1,以後按位取反直到符號位後一位。
根據負數的補碼求其原碼的方法:符號位保持不變,其餘各位取反,然後再整個數加1。
另外,兩個二進位制數相減,等於加上減數保持符號位不變,取反 +1,即使加上其補碼。
4)計算機只有加法器,將減法轉化成加法,是利用了數學中的同餘概念。
參考:
原碼反碼補碼的理解
本文採用4位二進位制數的例子,從表象對原碼反碼補碼進行 旨在說明為什麼計算機底層要用補碼表示數字以及用補碼表示數字的優點,不涉及任何數學原理。4位二進位制數的原碼表示 0 1 2 3 4 5 6 7 0000 0001 0010 0011 0100 0101 0110 0111 0 1 2 3 4 ...
再度理解原碼 反碼 補碼
很早就開始接觸這些熟悉又陌生的關鍵字,但是,時不時還會有錯 看定義 正數的原碼 反碼 補碼形式一致,負數的反碼為原碼的數值位取反,補碼為反碼 1也即是原碼的數值位取反再 1,計算機中以補碼表示資料和運算 舉例 34原碼 反碼 補碼 00100010 34原碼 10100010,反碼 11011101...
補碼原碼反碼簡單理解
看到一句i2s的data是以補碼形式來表現資料。再次查閱得出以下只管結論 1,首先直觀舉例機器裡面是如何存放有符號數的 1在機器裡面表示為 0000 0001h 0在機器裡面表示為 0000 0000h 1在機器裡面表示為1111 1111h 2在機器裡面表示為1111 1110h 其實機器並不知道...