Java中位移操作的不同行为

5

我正在使用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

这个问题是关于这种方法为什么会失败的原因是什么?

0的类型 - ZhongYu
考虑以下代码:byte b = 1 + 1; 是可以的,但是 byte b = byteVar + 1; 就不行了。 - ZhongYu
3个回答

4

由于此代码片段中的valueshift均为编译时常量:

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

然后编译器会内联它们的值(用实际的值1替换所有出现的valueshift),并在运行时之前验证value << shift的结果不会导致任何精度损失。


与此同时,对于第二个片段:

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

编译器无法确定 "shift" 是否表示这样的值,不会导致精度丢失,因此会引发编译错误。
如果在这种情况下可能进行编译,则可以执行 "shiftAndCheck(1, 32);",这将导致 "byte" 类型溢出。

valuebyte 类型,所以为什么会出现 从 int 转换到 byte 的消息。在进行移位操作之前或之后,value 是否被提升为 int - Sabir Khan
1
因为默认情况下,数值运算符(包括 <<)会产生 int 类型的结果。 - Konstantin Yovkov
我输入了问题的代码(函数),并且没有收到问题中提到的错误信息,而是得到了“类型不匹配:无法将int转换为byte”的错误消息(针对函数内的byte result = value << shift;一行),这非常清楚地说明了问题。我使用的是Java7和Eclipse 4.4.1。不确定这个消息是否因平台或某些IDE设置而异。 - Sabir Khan
我正在使用OSX上的Java 1.8.0_60。 - imrichardcole

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

正如@Konstantin所说,它返回int,因此要么将其转换为byte,要么使用int result


0

默认情况下,对非浮点数进行算术运算会产生一个int结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接