为什么-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
答案 0 :(得分:6)
由于1
是int
,而不是long
,因此在转让声明之后才会转换为long
。 Java会注意到左手参数是int
而不是long
,并且会相应地舍入右手值。
如果左侧操作数的提升类型为int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到带有掩码值
&
(0x1f
)的按位逻辑AND运算符0b11111
(§15.22.1)的影响。因此,实际使用的移动距离始终在0
到31
的范围内,包括在内。
如果左侧参数声明为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