“+ =”运算符和int长的用法

这个问题在这里已经有了答案:

  • 为什么Java的+ =, - =,* =,/ =复合赋值操作符需要转换? 11个答案

  • 当你做+=这是一个复合语句并且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

    上一篇: "+=" operator and int long usage

    下一篇: Java int += double syntax surprise