为什么-1 << 23和-1 << 55在Java中返回相同的值?

dur*_*597 -6 java bit-shift long-integer

为什么-1 << 23和-1 << 55在Java中返回相同的值?它似乎应该是非常不同的,因为我正在转移更多的地方!但是,它们会产生相同的值.为什么会这样?

public class BitShifting {
  public static void main(String... args) {
    long foo = -1 << 23;
    long bar = -1 << 55;

    System.out.println(foo);
    System.out.println(bar);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

-8388608
-8388608
Run Code Online (Sandbox Code Playgroud)

dur*_*597 5

因为1是一个int,而不是一个long,并且转换到long赋值语句之后才会发生.Java会注意到左手参数是a int而不是a long,并且会相应地舍入右手值.

来自JLS:

如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离.就好像右手操作数受到带有掩码值()的按位逻辑AND运算符&(第15.22.1节)的影响.实际使用的移位距离因此总是在范围到,包括端值.0x1f0b11111031

如果左侧参数声明为1L,则行为将如预期一样,如下所示:

public class BitShifting {
  public static void main(String... args) {
    long foo = -1L << 23;
    long bar = -1L << 55;

    System.out.println(foo);
    System.out.println(bar);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

-8388608
-36028797018963968
Run Code Online (Sandbox Code Playgroud)

  • 如果你已经知道答案的话,那么没有真正看到发布"又一个问题"(我们在这里有很多这样的问题)关于没有意识到Java中的数字文字是"int"的价值.*是*,询问和回答你自己的问题很好,但如果这是非常好的理由,我没有看到这一点. (4认同)
  • 为了便于阅读,我建议使用`1L`而不是`1l` (4认同)