首先,瞭解原碼、反碼、補碼:
原碼:
使用高位作爲符號位。最高位爲0時表示正數,最高位爲1時則表示爲負數。其餘位使用此數字數值本身二進制的絕對值表示。
反碼:
使用高位作爲符號位。最高位爲0時表示正數,最高位爲1時則表示爲負數。正數的反碼還是正數本身;負數的補碼即在原碼的基礎上,符號位不變,其他位取反。
補碼:
使用高位作爲符號位。最高位爲0時表示正數,最高位爲1時則表示爲負數。正數的補碼就是正數本身,負數的補碼就是其原碼取反加一。
下面舉例:
正數/負數 | 原碼 | 反碼 | 補碼 |
---|---|---|---|
13 | 0000 1101 | 0000 1101 | 0000 1101 |
-13 | 1000 1101 | 1111 0010 | 1111 0011 |
右移(>>):
右移即帶符號右移。對於正數的右移,移位過程中、高位補零;對於負數的右移,因爲負數在內存中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼然後保證符號位不變,其餘位向右移動到X位,在移動的過程中,高位補1.等移位完成以後,然後保持符號位不變,其餘按位取反加1,得到移位後所對應數的原碼。即爲所求。
無符號右移(>>>):
對於正數的帶符號右移,不論正數還是負數,移位過程中高位均補零。
舉例:
正數右移和無符號右移是都是高位補零
原數字 | 原碼(二進制數) | (無符號)右移/4位 | 結果 |
---|---|---|---|
60 | 0011 1101 | 0000 0011 | 3 |
負數右移
原數字 | 原碼(二進制數) | 補碼 | 右移4位 | 轉換成原碼 | 結果 |
-60 | 10000000 00000000 00000000 00111101 | 11111111 11111111 11111111 11000011 | 11111111 11111111 11111111 11111100 | 10000000 00000000 00000000 00000100 | -4 |
負數無符號右移
原數字 | 原碼(二進制數) | 補碼 | 無符號右移4位 | 結果 |
---|---|---|---|---|
-60 | 10000000 00000000 00000000 00111101 | 11111111 11111111 11111111 11000011 | 00001111 11111111 11111111 11111100 | 268435452 |
由於負數是以補碼的形式保存,因此帶符號右移時>>,高位依次爲1,才能保證轉換成原碼後值不變!