什麼是原碼 反碼和補碼及由來

2021-10-03 10:45:09 字數 1808 閱讀 1214

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在8位的計算機中反碼為0 000 0110

負數6在8位的計算機中反碼為1 111 1001

再看正負6相加:

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為例:

正數6在8位的計算機中補碼為0 000 0110

負數6在8位的計算機中補碼為1 111 1010

-0的補碼為反碼(1 111 1111)加1等於1 0 000 0000,對於8位的計算機第一位的1捨棄掉了,所以最後結果為0 000 0000,與+0的補碼剛好重合了,也解決了兩個0問題。

那這樣加法運算的結果是否還是正確的呢?

再看正負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個.有了數值的表示方法就可以對數進行算術運算 但是很快就發現用帶符號位的原碼進行乘除運算時結果正確 而在加...