1

在下面的三个按位左移代码片段中,有趣的是示例 #2 和 #3 在 Java 中的处理方式不同。在最后一个示例(#3)中,为什么 Java 决定不将复合赋值语句升级为 int?

答案是否与 Java 做“内联”的事情有关。非常感谢您的任何评论。

byte b = -128;

// Eg #1.  Expression is promoted to an int, and its expected value for an int is -256.
System.out.println(b << 1);

b = -128;
// Eg #2.  Must use a cast, otherwise a compilation error will occur.  
// Value is 0, as to be expected for a byte.
System.out.println(b = (byte)(b << 1));

b = -128;
// Eg #3.  Not only is no cast required, but the statement isn't "upgraded" to an int.
// Its value is 0, as to be expected for a byte.
System.out.println(b <<= 1);
4

2 回答 2

4

复合赋值运算符(例如+=and-=<<=等)在其运算中具有隐式类型转换。

换句话说。

byte x = 1;
x <<= 4;

等于:

byte x = 1;
x = (byte)(x << 4);

编译时。

左移操作仍然会适当地提升变量(在byteto an的情况下int),但复合赋值运算符会为您转换它。

于 2013-11-08T12:45:27.560 回答
1
println b <<= 1

是相同的

b = (byte) (b << 1)
println b

所以这意味着演员阵容byte以及你的第二个例子。

于 2013-11-08T12:44:20.967 回答