long a2 = 100L * 1024 * 1024 * 1024;
在此操作中,至少有一个操作数是 long
. 。因此,使用64位精度进行操作,数值操作员的结果是类型 long
. 。另一个非长操作数被扩大到类型 long
经过 数字促进 并将结果存储到变量 a2
.
long a1 = 100 * 1024 * 1024 * 1024;
普通整数的恒定表达式,将表达式的结果计算为一种类型 int
. 。计算值但是太大而无法适合整数并因此溢出,从而导致 0
并存储到 a1
多变的。
编辑:如以下评论所要求的:
为什么不负面?
因为在 整数计算 第二个计算等同于 25 * 2^32
在哪里 ^
具有力量含义和 2^32
整数值是 0
. 。但是,解释为什么它的价值是 0
: :in Binary:
100 * 1024 * 1024 * 1024 == 25 * 2^32;
Integer.MAX_VALUE = 2 ^ 31 -1 = 0 11111111 11111111 11111111 1111111
Integer.MAX_VALUE + 1 = 2 ^ 31 = 1 00000000 00000000 00000000 0000000
2 ^ 31
是一个负整数(-2147483648
),因为符号是 1
因此 2 ^ 32
只是 2
至 2 ^ 31
: :左移,标志钻头会变成 0
因此结果是 0
.
查看 java language specification: 4.2.2: Integer operation
有关详细信息。