在下面的三个按位左移代码片段中,有趣的是Java和#3和#3的处理方式不同。在最后一个例子中(#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);
答案 0 :(得分:3)
复合赋值运算符(例如+=
和-=
以及<<=
等在其操作中具有隐式类型转换。
换句话说。
byte x = 1;
x <<= 4;
等于:
byte x = 1;
x = (byte)(x << 4);
编译时。
左移操作仍然适当地提升变量(在byte
到int
的情况下),但是复合赋值运算符会为你投射它。
答案 1 :(得分:1)
println b <<= 1
与
相同b = (byte) (b << 1)
println b
所以这意味着施放到byte
以及你的第二个例子。