先說下原碼和補碼, 只說負數 以-2 爲列 int 32位
-2 的原碼爲 10000000 00000000 00000000 00000010
原碼轉換補碼 原碼 符號位不變 其餘全部取反 然後+1
即 -2 的補碼爲 11111111 11111111 11111111 11111110
計算機中數字採用補碼錶示,原因 0的表示和運算等原因
>> 算數右移 考慮符號位 -2>>1 後計算機裏表示爲 11111111 11111111 11111111 11111111 轉成原碼爲 100000000000000000000。。。1 即 -1
>>> 邏輯右移 不考慮符號位 左邊都填0 所以 -2>>>1 後計算機裏的表示爲 01111111111111111111111111111111 轉原碼爲 01111111111111111111111111111111 因爲正數的原碼和補碼反碼都一樣,所以結果爲2147483647
Ps 反碼: 原碼 符號位不變 其餘位取反。