[英]Differing behaviour when shifting bits in java
我正在使用Java中的位移,并使下面的代码按预期工作:
final byte value = 1;
final int shift = 1;
byte result = value << shift;
这会产生预期的值2
。 但是,如果我尝试将其提取到如下方法中:
private void shiftAndCheck(final byte value, final int shift) {
byte result = value << shift;
}
这会导致编译错误:
java: incompatible types: possible lossy conversion from int to byte
问题是导致失败的方法是什么?
由于value
和shift
是此代码段中的编译时常量:
final byte value = 1;
final int shift = 1;
byte result = value << shift;
然后编译器内联它们的值(替换所有出现的value
并使用它们的实际值1
shift
)并且可以在运行时之前验证value << shift
的结果不会导致任何精度损失。
同时,对于第二个片段:
private void shiftAndCheck(final byte value, final int shift) {
byte result = value << shift;
}
编译器没有证据表明shift
代表这样的值,这不会导致精度损失,这就是为什么会引发编译错误。
如果在这种情况下可以编译,那么你就可以做shiftAndCheck(1, 32);
这会导致byte
类型溢出。
默认情况下,对非浮点数的算术运算会产生一个int
结果
private void shiftAndCheck(final byte value, final int shift) {
byte result = (byte) (value << shift);
}
由于@Konstantin已经说它返回int
,所以要么将其转换为byte,要么使用int result
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.