原碼 反碼 補碼掃盲貼

2021-10-04 14:33:20 字數 2442 閱讀 4254

背景:

對於乙個數字,計算機需要使用一定的可運算的編碼方式對其進行編碼。我們這裡所講的原碼,反碼,補碼都是計算機對具體二進位制資料的編碼方式。

例如對於乙個簡單的數字6, 我們可以用四個二進位制位0110這樣的表示。

什麼是原碼?

計算機中所有的數均用0、1編碼表示,數字的正負號也不例外,如果乙個機器數字長是n位的話,約定最左邊的第一位用作符號位(0表示整數,1表示負數),其餘n-1位用於表示數值。比如:(以8位二進位制為例)

+1 的原碼 = 0000 0001

-1的原碼 = 1000 0001

因為第一位是符號位,所以8位二進位制數的取值範圍就是:(1111 1111)~ (0111 1111),即[-127 ~ 127]。以此類推,用原碼表示的n位二進位制數的取值範圍就是:

-2^(n-1) ~ 2^(n-1)

補碼計算時應根據此範圍進行判斷是否發生溢位。

原碼的缺點

原碼不能直接參加運算,可能會出錯。最明顯的就是乙個數與它相反數相加不等於0,例如,1+(-1)=0,而在二進位制中00000001+10000001=10000010,10000010換算成十進位制為-2。顯然是不對的,為了解決這個問題,於是反碼出現了。

那麼什麼是反碼?

為了解決上面提到的問題,反碼表示法規定:

正數的反碼就是其原碼

負數的補碼在其原碼的基礎上,符號位不變,其餘各位取反

這樣當原碼需要運算時,我們可以用它的反碼來運算得到正確結果:

+1 = 0000 0001(原) = 0000 0001(反)

-1 = 1000 0001 (原) = 1111 1110 (反)

用+1的反碼與-1的反碼進行計算再把得到的結果轉換成原碼:

[ +1 + (-1)] = 0000 0001+ 1111 1110 = 1111 1111

而反碼1111 1111 = 原碼10000000 = -0

當我們使用反碼計算時,就可以解決乙個數與它的相反數相加不等於0的問題。但是又有了新的問題,讓我們嘗試兩個負數相加:

-1 的原碼為1001,反碼為 1110

-3的原碼為1011,反碼為 1100

(-1) + (-3) =1110+1100= 1010

而1010的原碼為1101,即-5,很明顯不是我們要的結果。

反碼的出現解決了相反數問題,但是卻出現了兩個負數的相加出錯的問題。於是乎,為了解決這個問題,補碼出現了。

什麼是補碼?

補碼表示法規定

正數的補碼與其原碼相同;

負數的補碼是在其反碼的末位加1。

有了補碼,我們就可以利用補碼來進行加減運算,補碼的加減運算公式為:

[x]補+[y]補=[x+y]補

原碼、反碼、補碼的轉換

已知原碼,求補碼

思路:先根據左邊第一位判斷正負數,若為正數,則補碼還是其本身,若為負數先轉換為反碼,再將反碼轉換為補碼。

例:已知某數x的原碼為10110100,試求x的補碼和反碼。

1 0 1 1 0 1 0 0 原碼

1 1 0 0 1 0 1 1 反碼,符號位不變,數值位取反

1 1 0 0 1 1 0 0 補碼(在反碼的末位加1)

[x]補=11001100,[x]反=11001011。

已知補碼,求原碼:

思路:先判斷正負情況,若為負數,按照求負數補碼的逆過程,對最低位減1,然後取反。但是對二進位制數來說,先減1後取反和先取反後加1得到的結果是一樣的,所以可以採用取反加1 有方法。

例:已知某數x的補碼11101110,試求其原碼。

1 1 1 0 1 1 1 0 補碼

1 1 1 0 1 1 0 1 反碼(末位減1)

1 0 0 1 0 0 1 0原碼(符號位不變,數值位取反)

所以[x]原=10010010.

總結

計算原碼只要在轉化的二進位制數前面加上相應的符號位就行了.

反碼的求法:對於負數,將原碼各位取反,符號位不變.

補碼的求法:對於負數,將反碼加上二進位制的1即可,也就是反碼在最後一位上加上1就是補碼了.

原碼 反碼 補碼 移碼掃盲

原碼 如果機器字長為n,那麼乙個數的原碼就是用乙個n位的二進位制數,其中最高位為符號位 正數為0,負數為1。剩下的n 1位表示概數的絕對值。例如 x 101011 x 原 00101011 x 101011 x 原 10101011 位數不夠的用0補全。ps 正數的原 反 補碼都一樣 0的原碼跟反碼...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...