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

时间:2015-01-30 16:00:46

标签: java long-integer bit-shift

为什么-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);
  }
}

输出:

-8388608
-8388608

1 个答案:

答案 0 :(得分:6)

由于1int,而不是long,因此在转让声明之后才会转换为long。 Java会注意到左手参数是int而不是long,并且会相应地舍入右手值。

From the JLS

  

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

如果左侧参数声明为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);
  }
}

输出:

-8388608
-36028797018963968