“+ =”运算符和int长的用法
这个问题在这里已经有了答案:
当你做+=
这是一个复合语句并且Compiler在内部转换它。 在第一种情况下,由于它是直接声明,所以编译器直接向你大声喊叫:)
该线
b += Long.MAX_VALUE;
它的编译器版本相当于
b += (int)Long.MAX_VALUE;
当然会有长转换为int的有损转换。
http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.2
E1 op = E2形式的复合赋值表达式等价于E1 =(T)((E1)op(E2)),其中T是E1的类型,只是E1只计算一次。
其实编译器比你想象的更聪明。 在编译时本身,它会将表达式b+=Long.MAX_VALUE
的实际值替换为-1
。 所以, Long.MAX_VALUE
被转换为一个int
并在编译时本身分配给int字段)
字节码:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=2, args_size=1
0: iconst_0
1: istore_1
2: iinc 1, -1 // Here
5: return
LineNumberTable:
line 4: 0
line 5: 2
line 6: 5
LocalVariableTable:
Start Length Slot Name Signature
0 6 0 args [Ljava/lang/String;
2 4 1 b I
链接地址: http://www.djcxy.com/p/12787.html