原碼是什么?
-
原碼就是早期用來表示數字的一種方式: 一個正數,轉換為二進制位就是這個正數的原碼。負數的絕對值轉換成二進制位然后在高位補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
各自的優缺點:
- 原碼最好理解了,但是加減法不夠方便,還有兩個零。。
- 反碼稍微困難一些,解決了加減法的問題,但還是有有個零
- 補碼理解困難,其他就沒什么缺點了
反碼是如何解決加減運算的問題原因如下:
計算機中加法運算比減法運算實現起來簡單很多,對反碼做減法運算可以將被減數看作 加上被減數的負數形式,也就是將被減數出符號為取反。
補碼是如何解決正負零之分的問題原因如下:
在原碼中,最高位是符號位。那么就存在正數0 -> 0000 0000 0000 0000,還存在負數0-> 1000 0000 0000 0000,這就存在兩種0,反碼也存在這個問題。 而在補碼中,正數0 -> 0000 0000 0000 0000,假設存在負數0,那么按照補碼的轉換規則為 -> 1111 1111 1111 1111。可以看出這個數表示-2的15次方,不是-0,所以補碼只有一個0。