为什么 -2>>>1 在 Java 中等于 2147483647

Why -2>>>1 equals 2147483647 in Java

-2的补码是100000...01

-2的二进制补码是 1000000...10

-2 >>> 1 

根据>>>定义向左移0

应该是01000......1,为什么变成了0111111..11

为了生成 2 的二进制补码表示(即 -2 的表示),您从 2 的表示开始,翻转其所有位,然后添加 1 到结果:

00000000000000000000000000000010 -- This is 2
11111111111111111111111111111101 -- This the inverse of 2
11111111111111111111111111111110 -- This is the inverse of 2, plus 1

-2的二进制表示是11111111111111111111111111111110 (demo).

不带符号扩展将其右移一位产生

01111111111111111111111111111111

这正是您得到的结果。