2017-02-19 55 views
1

我尝试在JAVA中使用正确的二进制移位。请看下面的代码:JAVA右移位返回wrond值

int val = 180000; 
val >>>= 8; // val == 703, ok 
val >>>= 8; // val == 2 , lok 
val >>>= 8; // val == 0 , ok 
... 

它的工作是确定的。但是,当我尝试使用此代码(从C项目ctr + c ctr + v)我无法计算正确的值,当移位len是最大的32位。

int val; 
val = 180000; 
val >>>= 8; //val = 703, ok 
val = 180000; 
val >>>= 16; //val = 2, ok 
val = 180000; 
val >>>= 32; //val = 180000, wrong :(

为什么上次操作在第二个例子中计算错误的值?

回答

2

为什么上次在第二个例子中的操作计算出错误的值?

该值根据规范计算。你的期望是错误的。从JLS 15.19开始:

如果左侧操作数的提升类型是int,那么只有右侧操作数的五个最低位用作移位距离。就好像右侧的操作数受掩码值0x1f(0b11111)的按位逻辑AND运算符&(第15.22.1节)的处理。实际使用的换档距离总是在0到31的范围内。