正數的原碼,反碼,補碼

2021-08-20 02:30:43 字數 1577 閱讀 1578

這之前,遇到什麼原碼,反碼,補碼,就頭疼,其實遇到乙個自己怕的問題,就一定要解決它,吃掉它,這樣心裡的心結就解決了,不然等到以後,每次遇到都是跳過,跳過,難受香菇。

首先提幾個概念: 原碼,反碼,補碼 

原碼是什麼?

原碼就是早期用來表示數字的一種方式: 乙個正數,轉換為二進位制位就是這個正數的原碼。負數的絕對值轉換成二進位制位然後在高位補1就是這個負數的原碼

舉例說明:

int型別的 3 的原碼是 11b(b表示二進位制位), 在32位機器上佔四個位元組,那麼高位補零就得:

00000000 00000000 00000000 00000011

int型別的 -3 的絕對值的二進位制位就是上面的 11b 展開後高位補零就得:

10000000 00000000 00000000 00000011      

但是原碼有幾個缺點,零分兩種 +0 和 -0 。很奇怪是吧!還有,在進行不同符號的加法運算或者同符號的減法運算的時候,不能直接判斷出結果的正負。你需要將兩個值的絕對值進行比較,然後進行加減操作 ,最後符號位由絕對值大的決定。於是反碼就產生了。

反碼是什麼 ?

正數的反碼就是原碼,負數的反碼等於原碼除符號位以外所有的位取反

舉例說明:

int型別的 3 的反碼是

00000000 00000000 00000000 00000011

和原碼一樣沒什麼可說的

int型別的 -3 的反碼是

11111111 11111111 11111111 11111100

除開符號位 所有位 取反

解決了加減運算的問題,但還是有正負零之分,然後就到補碼了

補碼是什麼?

正數的補碼與原碼相同,負數的補碼為 其原碼除符號位外所有位取反(得到反碼了),然後最低位加1.

還是舉例說明:

int型別的 3 的補碼是:

00000000 00000000 00000000 00000011

int型別的 -3 的補碼是

11111111 11111111 1111111 11111101

就是其反碼加1

最後總結一下:

正數的反碼和補碼都與原碼相同。

負數的反碼為對該數的原碼除符號位外各位取反。

負數的補碼為對該數的原碼除符號位外各位取反,然後在最後一位加1  

各自的優缺點:

原碼最好理解了,但是加減法不夠方便,還有兩個零。。

反碼稍微困難一些,解決了加減法的問題,但還是有有個零

補碼理解困難,其他就沒什麼缺點了

喔日,說到這裡,估計都暈了,舉個栗子把。

5的原碼是 00000000000000000000000000000101(四個位元組,32位(byte))

5的原碼和反碼,補碼都一樣。

-5的原碼是原碼除符號位以外所有的位取反 ,10000000000000000000000000000101

-5的反碼就是原碼符合外取反得到反碼11111111111111111111111111111010

-5的補碼就是反碼加一得到補碼11111111111111111111111111111011

最後補充一句,負數一般用補碼來計算。

正數的原碼,反碼,補碼

首先提幾個概念 原碼,反碼,補碼 原碼是什麼?原碼就是早期用來表示數字的一種方式 乙個正數,轉換為二進位制位就是這個正數的原碼。負數的絕對值轉換成二進位制位然後在高位補1就是這個負數的原碼 舉例說明 int型別的 3 的原碼是 11b b表示二進位制位 在32位機器上佔四個位元組,那麼高位補零就得 ...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 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 當...