1. 原碼
在計算機裡是以二進位制表示的,只有0和1,數字的正負沒有多餘符號表示的。那為了分出正負就發明了原碼:如果是8位的計算機,取出8位中的第一位不參與數字值的表示,用來表示正負。如果第一位是0,那就規定這個數為正數,如果第一位是1,那就規定這個數為負數。這種表示法稱為原碼。
比如10進製的6的二進位制表示為:110。但原碼在加法(減法運算可以看成是負數的加法運算)運算的時候結果是不對的,正數6在8位的計算機中原碼為0 000 0110。第乙個0為正負數表示位,同理16位計算機表示+6為:0 000 0000 0000 0110,32位計算機以此類推。
同上:負數6在8位的計算機中原碼為1 000 0110。
如正負6相加:
0 000 0110
+ 1 000 0110
-------------
1 000 1100
結果為-14,明顯是不正確的,結果應該為0的。為了解決這個問題,又發明了反碼。
2. 反碼
反碼為在原碼的基礎上,正數的反碼為原碼,負數的反碼為符號位不變其它位取反。
還以6為例:再看正負6相加:正數6在8位的計算機中反碼為0 000 0110
負數6在8位的計算機中反碼為1 111 1001
0 000 0110
+ 1 111 1001
-------------
1 111 1111 -0 的反碼
再以3和-8相加為例證明:
0 000 0011 3 反碼為本身
+ 1 111 0111 -8 的反碼
-------------
1 111 1010 -5 的反碼
這兩個結果都是正確的。這樣解決了正負相加為0的問題。
但這樣又產生了另乙個問題:0反碼有兩個,1 111 1111也表示0(只不過為負的),0 000 0000也表示0(為正的),為了解決這個兩個補碼為0的問題呢,又發明了補碼。
3. 補碼
補碼為在反碼的基礎上,正數的補碼為原碼,負數的補碼為反碼加1,也就是補乙個1。
還以6為例:-0的補碼為反碼(1 111 1111)加1等於1 0 000 0000,對於8位的計算機第一位的1捨棄掉了,所以最後結果為0 000 0000,與+0的補碼剛好重合了,也解決了兩個0問題。正數6在8位的計算機中補碼為0 000 0110
負數6在8位的計算機中補碼為1 111 1010
那這樣加法運算的結果是否還是正確的呢?
再看正負6的加法運算:
0 000 0110
+ 1 111 1010
-------------
10 000 0000 最高位1捨棄,最後結果為補碼,但正數的補碼和原碼相同。
結果也是正確的,這樣就解決了加法運算和兩個0問題。其它數值加法運算可以自證。
總結原碼是第一位為符號位,其它位為數值位的表示方法。
反碼是原碼的符號位不變,其它位取反。
補碼是反碼補1,如果超出了計算機的最多可表示位,最高位捨棄。
以上2、3只針對負數,也就是說正數的反碼和補碼都為原碼。 思考
8位能表示的範圍是-128 ~ 127,也就是-2(8-1) ~ 2(8-1) - 1。為什麼負數比正數多1位數?
補碼溢位怎麼辦,計算結果不正確?
什麼是原碼 反碼和補碼?
什麼是原碼 反碼 補碼?計算機中的符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示 正 用1表示 負 而數值位,三種表示方法各不相同。在數值前直接加一符號位的表示法。例如 7的原碼是10000111 正數的反碼與其原碼相同 負數的反碼是對其原碼逐位取...
原碼 反碼 補碼以及為什麼要用反碼和補碼
原文遷移到 機器數乙個數在計算機中的二進位制表示形式,叫做這個數的機器數,機器數是帶符號的,在計算機中用乙個數的最高位存放符號,正數為0,負數為1,比如,十進位制中的 3,假設計算機字長為8位,轉換成二進位制就是0000 0011,如果是 3,就是1000 0011.那麼,這裡0000 0011和1...
原碼 反碼和補碼
數值有正負之分 計算機就用乙個數的最高位存放符號 0為正 1為負 這就是機器數的原碼了 假設機器能處理的位數為 8.即字長為 1byte,原碼能表示數值的範圍為 127 0 0 127 共256個.有了數值的表示方法就可以對數進行算術運算 但是很快就發現用帶符號位的原碼進行乘除運算時結果正確 而在加...