作者:LogM
本文原載於 https://segmentfault.com/u/logm/articles ,不允許轉載~
文章難免有錯誤之處,請在原文評論處指出~
1. 補碼的表示形式
計算機中整數用補碼錶示。
舉例:假設數值類型爲char型(8位)
十進制:8
原碼:0000 1000
補碼:0000 1000(正數的補碼等於原碼)
十進制:-8
原碼:1000 1000
反碼:1111 0111
補碼:1111 1000(負數的補碼等於反碼加1)
2. 爲什麼用補碼錶示
用補碼錶示是爲了使計算機的整數加法能用同一種電路完成,無論是正整數還是負整數。
建議閱讀:LeetCode習題:位運算實現整數加法
3. 補碼的本質
以-8爲例:
十進制:-8
補碼:1111 1000
可以發現,-8的補碼與248的二進制表示竟然相同。
十進制:248
二進制:1111 1000
這是巧合嗎?
char型共8位,所以有:
可能我解釋不夠清楚,小夥伴們可以自己用谷歌檢索答案。
4. 負數的左右移
- 左移:不斷在右邊補0,符號位會被移出,全移完是0
- 右移:不斷在左邊補1,全移完是-1的補碼
- 觀察可知:負數的右移不再嚴格對應整數除法的除2
十進制:-8
補碼:1111 1000
左移後的補碼:1111 0000(十進制-16)
右移後的補碼:1111 1100(十進制-4)
十進制:-5
補碼:1111 1011
左移後的補碼:1111 0110(十進制-10)
右移後的補碼:1111 1101(十進制-3,而整數除法的除2結果爲-2,兩者不對應)