左移的丢失信息是存储在Java中的某个地方吗?

时间:2018-05-27 19:42:28

标签: java bit-manipulation bitwise-operators bit bit-shift

所以我在Java中尝试左移,我发现了一些我不理解的东西。下面的代码描述了它。

int x = -1 << 32; // one more left shift
System.out.print(Integer.toBinaryString(-1) + " -1\n");
System.out.print(Integer.toBinaryString(x) + " " + x + "\n");

// output
11111111111111111111111111111111 -1
11111111111111111111111111111111 -1

所以我在整数-1的左边摆脱了31个1,结果就是我的预期。然而,在我试图离开1个位置后,而不是0,我得到了-1。

System.out.println(-2147483648 << 1); // the output is 0

然后我尝试将最小整数值-2147483648直接移动1.我得到了预期的值0。

{{1}}

有人可以向我解释幕后发生的事情吗?

1 个答案:

答案 0 :(得分:0)

这是JLS 15.19

  

如果左侧操作数的提升类型为int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移动距离始终在0到31的范围内,包括0和31。

所以-1 << 32-1 << 0相同,解释了您的结果。