?? 很多東西,長時間不用不看,會越來越生疏,昨天回顧了一下位運算,在這里把相關(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ù)。