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)
因为1是一个int,而不是一个long,并且转换到long赋值语句之后才会发生.Java会注意到左手参数是a int而不是a long,并且会相应地舍入右手值.
如果左侧操作数的提升类型是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)