二進位制表示數的三種基本編碼方式:原碼,反碼與補碼。
原碼:符號位和數字實際值的結合。正數是數值本身,符號位為0;負數是數值本身,符號位為1。8位二進位制數的表示範圍是[-127, 127]。
反碼:正數是數值本身,符號位為0;負數的數值部分是正數表示的基礎上對各個位取反,符號位為1。8位二進位制數的表示範圍是[-127, 127]。
補碼:正數是數值本身,符號位為0,負數的數值部分是在正數表示的基礎上對各個位取反後加1,符號位為1。8位二進位制數的表示範圍是[-128, 127]。
三種編碼方式對比如表1-1所示。
表1-1 三種編碼方式對比
正數/負數原碼反碼補碼
10000 0001
0000 0001
0000 0001
-11000 0001
11111 1110
1111 1111
20000 0010
0000 0010
0000 0010
-21000 0010
1111 1101
1111 1110
為了加速計算機對加減乘除的運算速度,減少額外的識別成本,反碼和補碼應運而生。以減法計算為例,減去乙個數等於加上這個數的負數,例如1-2=1+(-2)= -1。在計算機中延續這種計算思維,不需要額外做符號識別,使用原碼計算的結果為1-2=1+(-2)= [0000 0001]原 + [1000 0010]原 = [1000 0011]原 = -3,這個結果顯然是不正確的。為了解決這一問題,出現了反碼的編碼方式。使用反碼計算,結果為1-2=1+(-2)= [0000 0001]反 + [1111 1101]反 = [1111 1110]反 = -1,結果正確。但是在某些特殊的情況下,使用反碼存在認知問題,例如2-2 = 2 + (-2)= [0000 0010]反 + [1111 1101]反 = [1111 1111]反 = -0,結果**現了-0,但實際上0不存在+0和-0兩種表達方式,他們對應的都是0。隨著數字的編碼表示的發展,補碼誕生了,它解決了反碼中+0和-0的問題。例如2-2 = 2+(-2)= [0000 0010]補 + [1111 1110]補 = [0000 0000]補 = 0。補碼的出現除解決運算的問題外,還帶來乙個額外的好處,即在占用相同位數的條件下,補碼的表達區間比之前兩種表達區間更大。例如,8位二進位制編碼中,補碼表示的範圍增大到-128,其對應的補碼為[1000 0000]補。8條電路的最大值為0111 1111即127,表示範圍因有正負之分而改變為-128~127,二進位制整數最終都是以補碼形式出現的。正數的補碼與原碼、反碼是一樣的,而負數的補碼是反碼加1的結果。這樣使減法運算可以使用加法器實現,符號位也參與運算。
計算結果需要9條電路表示,用8條電路來表達計算結果會溢位,即在數值運算過程中,超出規定的表示範圍。一旦溢位,計算結果就是錯誤的。在各種程式語言中,均規定了不同數字型別的表示範圍,有相應的最大值和最小值。
在以上示例中的一條電路線在計算機中被稱為1位,即1個bit,簡寫為b。8個bit組成乙個單位,稱為乙個位元組,即1個byte,簡寫為b。1024個byte,簡寫為kb;1024kb,簡寫為mb;1024mb,簡寫為gb,這些都是計算機中常用的儲存計量單位。
負數的二進位制表示
原碼 反碼 補碼 反碼 1 負數的二進位制表示法 比如,假設有一 int 型別的數,值為5,那麼,我們知道它在計算機中表示為 00000000 00000000 00000000 00000101 5轉換成二制是101,不過int型別的數占用4位元組 32位 所以前面填了一堆0。現在想知道,5在計算...
負數的二進位制表示
原碼 正數原碼就是其二進位制。負數的原碼就是其二進位制,並將最高位作為符號位設為1。eg 1 原碼為 1000 0001複數進行運算時用補碼表示負數補碼 負數原碼不考慮最高符號位的原碼的反碼 1 eg 1 的補碼為 1111 1110 反碼 1 1111 1111 在二進位製碼中,為了區分正負數,採...
1的二進位制表示
我們已經知道計算機中,所有資料最終都是使用二進位制數表達。我們也已經學會如何將乙個10進製數如何轉換為二進位制數。不過,我們仍然沒有學習乙個負數如何用二進位制表達。比如,假設有一 int 型別的數,值為5,那麼,我們知道它在計算機中表示為 00000000 00000000 00000000 000...