位運算:原碼、反碼、補碼

?? 很多東西,長時間不用不看,會越來越生疏,昨天回顧了一下位運算,在這里把相關(guān)的知識點(原碼、反碼、補碼)記錄下,以便后期查看!

原碼

? 1. 八位二進(jìn)制舉例說明,符號位(首位:0-正數(shù),1-負(fù)數(shù))?加上?數(shù)值位

負(fù)數(shù)(原碼) 正數(shù)(原碼)
1000 0000?(-0) 0000 0000?(0)
1000 0001?(-1) 0000 0001?(1)
1000 0010?(-2) 0000 0010?(2)
... ...
1111 1110?(-126) 0111 1110?(126)
1111 1111?(-127) 0111 1111?(127)

? 2. 從原碼看,除去符號位,八位二進(jìn)制的取值范圍是 [ 1111 1111 , 0111 1111 ],即 [ -127 , 127 ]。

反碼

? 1.正數(shù)的反碼是其自身,負(fù)數(shù)的反碼是符號位不變,其余數(shù)值位取反。

負(fù)數(shù)(原碼) 負(fù)數(shù)(反碼) 正數(shù)(原碼、反碼)
1000 0000?(-0) 1111 1111?(-0) 0000 0000?(0)
1000 0001?(-1) 1111 1110?(-1) 0000 0001?(1)
1000 0010?(-2) 1111 1101?(-2) 0000 0010?(2)
... ... ...
1111 1110?(-126) 1000 0001?(-126) 0111 1110?(126)
1111 1111?(-127) 1000 0000?(-127) 0111 1111?(127)

? 2. 從反碼看,除去符號位,八位二進(jìn)制的取值范圍是 [ 1000 0000 , 0111 1111 ],還是 [ -127 , 127 ]。

補碼

? 1. 正數(shù)的補碼是其自身,負(fù)數(shù)的補碼是在其反碼的基礎(chǔ)上+1。

負(fù)數(shù)(原碼) 負(fù)數(shù)(反碼) 負(fù)數(shù)(補碼) 正數(shù)(原碼、反碼、補碼)
1000 0000?(-0) 1111 1111?(-0) 0000 0000?(-0) 0000 0000?(0)
1000 0001?(-1) 1111 1110?(-1) 1111 1111?(-1) 0000 0001?(1)
1000 0010?(-2) 1111 1101?(-2) 1111 1110?(-2) 0000 0010?(2)
... ... ... ...
1111 1110?(-126) 1000 0001?(-126) 1000 0010?(-126) 0111 1110?(126)
1111 1111?(-127) 1000 0000?(-127) 1000 0001?(-127) 0111 1111?(127)
1000 0000?(-128)

? 2. 從補碼看,除去符號位,八位二進(jìn)制的取值范圍是 [ 1000 0000 , 0111 1111 ],比原碼和反碼多了一個最低數(shù),即 [ -128 , 127 ]。

既然有了原碼,為什么還要出現(xiàn)反碼和補碼呢?

  • 從上面的內(nèi)容可以看出,正數(shù)的原碼、反碼、補碼是一樣的,但是負(fù)數(shù)的都不一樣,所以就不用過多解釋正數(shù)了,我們主要看一下負(fù)數(shù)。如下圖計算:明顯看出原碼計算結(jié)果有問題,并且正負(fù)數(shù)相加結(jié)果變小了。
計算 結(jié)果
1 - 1 0
1 + (-1) = 1 - 1 0
0000 0001 (1的原碼) + 1000 0001 (-1的原碼) 1000 0010 (原碼)?(-2)
  • 為了解決計算機(jī)做減法出現(xiàn)上圖問題,以及讓符號位也可以直接參與計算,避免計算機(jī)對符號位的識別,于是出現(xiàn)了反碼。如下圖計算:
計算 結(jié)果
1 - 1 0
1 + (-1) = 1 - 1 0
0000 0001 (1的反碼) + 1111 1110 (-1的反碼) 1111 1111 (反碼)?=?1000 0000 (原碼)?(-0)
  • 可以看出,通過上圖描述的反碼計算,結(jié)果正確了,但是這里發(fā)現(xiàn)了兩個問題,一個是出現(xiàn)了-0(1000 0000)和+0(0000 0000),另外一個是在正負(fù)數(shù)反碼相加的結(jié)果 大于0時,出現(xiàn)了一個單位的誤差。如下圖計算:
計算 結(jié)果
2 - 1 1
2 + (-1) = 2 - 1 1
0000 0010 (2的反碼) + 1111 1110 (-1的反碼) 0000 0000 (反碼)?=?0000 0000 (原碼)?(0)
  • 為了解決這個單位差,和正負(fù)0的問題,出現(xiàn)了補碼,在反碼的基礎(chǔ)上+1。如下圖計算:
計算 結(jié)果
2 - 1 1
2 + (-1) = 2 - 1 1
0000 0010 (2的補碼) + 1111 1111 (-1的補碼) 0000 0001 (補碼)?=?0000 0001 (反碼)?=?0000 0001 (原碼)?(1)
  • 通過補碼計算,這里發(fā)現(xiàn)一個問題,-127(最低數(shù))變成了 1000 0001,這樣的話,1000 0000就沒有了對應(yīng)的十進(jìn)制數(shù),那么-128就來了。
-128由來
-128?=?-1 + (-127)?=?1111 1111(-1補碼) + 1000 0001(-127補碼)?=?1000 0000(-128補碼)?=?-27

-由此可以看出 8位二進(jìn)制(byte類型)的范圍是? [-27, 27-1],如下圖:

負(fù)數(shù)(補碼) 正數(shù)(補碼)
0000 0000?(-0) 0000 0000?(0)
1111 1111?(-1) 0000 0001?(1)
1111 1110?(-2) 0000 0010?(2)
... ...
1000 0010?(-126) 0111 1110?(126)
1000 0001?(-127) 0111 1111?(127)
1000 0000?(-128)
  • 由以上也可以推斷出為什么
    ? ?16位二進(jìn)制(short類型)的范圍是? [-215, 215-1];
    ? ?32位二進(jìn)制(int類型)的數(shù)據(jù)范圍是? [-231, 231-1]
    ? ?64位二進(jìn)制(long類型)的數(shù)據(jù)范圍是? [-263, 263-1]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容