int a = 1L;
这段代码编译不通过(当然了)。 类型不匹配:从 long 到 int 可能会导致数据丢失。
int b = 0;
b += Long.MAX_VALUE;
这段代码是可以编译通过的!
但是为什么会被允许呢?
int a = 1L;
这段代码编译不通过(当然了)。 类型不匹配:从 long 到 int 可能会导致数据丢失。
int b = 0;
b += Long.MAX_VALUE;
这段代码是可以编译通过的!
但是为什么会被允许呢?
+=
时,这是一个复合语句,编译器在内部进行类型转换。而在第一种情况下,编译器直接报错,因为它是一个直接语句:)b += Long.MAX_VALUE;
b += (int)Long.MAX_VALUE;
实际上,编译器比你想象的更聪明。在编译时,它将用 -1
替换表达式 b+=Long.MAX_VALUE
的实际值。因此,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