先说下原码和补码, 只说负数 以-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 反码: 原码 符号位不变 其余位取反。