我有这样的代码:
int a = 629339;
int b = 4096;
long res = a*b;
结果是-1717194752
但如果我添加一个手动转换到长long res = ((long)a)*b;
or long res = (long) a*b;
结果是正确的2577772544
谁能解释一下它是如何工作的。
您必须将赋值语句分成几个部分才能了解正在执行的操作:
long res = a*b;
步骤 1 获取值a
and b
.
第 2 步是评估a * b
。自从a
and b
都是int
s,这是一个int
乘法。所以我们乘以629339
by 629339
这将是2577772544
。
很遗憾,2577772544
大于 Java 的最大可能值int
value ...所以乘法运算默默地进行溢出...我们得到-1717194752
反而。
第 3 步,我们将 RHS 的值分配给 LHS。由于 RHS 是int
LHS 是float
,JLS 说我们执行原始拓宽转换...这只是变成-1717194752
into a long
具有相同的值。然后将加宽的值分配给res
.
为了得到您期望的答案,我们必须使用以下命令强制执行乘法long
算术。例如:
long res = ((long) a) * b;
在这种情况下,我们有一个乘法long
by an int
,这是通过扩大int
to a long
并执行一个long
乘。这不再溢出(因为2577772544
远低于最大的long
value),所以当我们最终将值赋给res
,这就是您期望的数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)