原碼:
原碼就是早期用來表示數(shù)字的一種方式: 一個(gè)正數(shù),轉(zhuǎn)換為二進(jìn)制位就是這個(gè)正數(shù)的原碼。負(fù)數(shù)的絕對值轉(zhuǎn)換成二進(jìn)制位然后在高位補(bǔ)1就是這個(gè)負(fù)數(shù)的原碼。
舉例:
int類型的 3 的原碼是 11B(B表示二進(jìn)制位), 在32位機(jī)器上占四個(gè)字節(jié),那么高位補(bǔ)零就得:
00000000 00000000 00000000 00000011
int類型的 -3 的絕對值的二進(jìn)制位就是上面的 11B 展開后高位補(bǔ)零就得:
10000000 00000000 00000000 00000011
但是原碼有幾個(gè)缺點(diǎn),零分兩種 +0 和 -0 。很奇怪是吧!還有,在進(jìn)行不同符號(hào)的加法運(yùn)算或者同符號(hào)的減法運(yùn)算的時(shí)候,不能直接判斷出結(jié)果的正負(fù)。你需要將兩個(gè)值的絕對值進(jìn)行比較,然后進(jìn)行加減操作 ,最后符號(hào)位由絕對值大的決定。于是反碼就產(chǎn)生了。
反碼:
正數(shù)的反碼就是原碼,負(fù)數(shù)的反碼等于原碼除符號(hào)位以外所有的位取反
舉例:
int類型的 3 的反碼是
00000000 00000000 00000000 00000011
和原碼一樣沒什么可說的
int類型的 -3 的反碼是
11111111 11111111 11111111 11111100
除開符號(hào)位,所有位,取反
解決了加減運(yùn)算的問題,但還是有正負(fù)零之分,然后就到補(bǔ)碼了
補(bǔ)碼:
正數(shù)的補(bǔ)碼與原碼相同,負(fù)數(shù)的補(bǔ)碼為 其原碼除符號(hào)位外所有位取反(得到反碼了),然后最低位加1.
舉例:
int類型的 3 的補(bǔ)碼是:
00000000 00000000 00000000 00000011
int類型的 -3 的補(bǔ)碼是
11111111 11111111 1111111 11111101
就是其反碼加1
最后總結(jié):
正數(shù)的反碼和補(bǔ)碼都與原碼相同。
負(fù)數(shù)的反碼為對該數(shù)的原碼除符號(hào)位外各位取反。