在java中移位时的不同行为

时间:2016-01-29 12:11:55

标签: 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

问题是导致失败的方法是什么?

3 个答案:

答案 0 :(得分:4)

由于此代码段中的valueshift是编译时常量:

final byte value = 1;
final int shift = 1;
byte result = value << shift;

然后编译器内联它们的值(将valueshift的所有实例替换为它们的实际值1)并且可以在运行时之前验证{{1}的结果不会导致任何精度损失。

同时,对于第二个片段:

value << shift

编译器没有证据表明private void shiftAndCheck(final byte value, final int shift) { byte result = value << shift; } 将代表这样的值,这不会导致精度损失,这就是为什么会引发编译错误的原因。

如果在这种情况下可以进行编译,那么您就可以执行shift,这会导致shiftAndCheck(1, 32);类型溢出。

答案 1 :(得分:0)

默认情况下,对非浮点数的算术运算会产生int结果

答案 2 :(得分:0)

    private void shiftAndCheck(final byte value, final int shift) {
        byte result = (byte) (value << shift);
    }

由于@Konstantin已经说它返回int,因此要么将其转换为字节,要么使用int result