繁体   English   中英

两个正整数乘以long的结果为负值

[英]Casting result of multiplication two positive integers to long is negative value

我有这样的代码:

int a = 629339;
int b = 4096;
long res = a*b;

结果是-1717194752但如果我将一个手动转换添加到 long long res = ((long)a)*b; long res = (long) a*b; 结果是正确的2577772544谁能解释它是如何工作的。

您必须将赋值语句分解成多个部分才能了解在做什么:

long res = a*b;

第 1 步是获取ab的值。

第 2 步是评估a * b 因为ab都是int s,所以这是一个int乘法。 所以我们将629339乘以629339就是2577772544 不幸的是, 2577772544大于最大可能的 Java int值...所以乘法运算会悄无声息地溢出...我们得到-1717194752

第 3 步,我们将 RHS 的值分配给 LHS。 由于 RHS 是int而 LHS 是float ,JLS 说我们执行原始扩大转换......它只是将-1717194752转换为具有相同值的long 然后将加宽的值分配给res


为了得到您期望的答案,我们必须强制使用long算术执行乘法。 例如:

long res = ((long) a) * b;

在这种情况下,我们将一个long乘以一个int ,这是通过将int扩展为long并执行long乘法来处理的。 这不再溢出(因为2577772544远低于最大的long值),所以当我们最终将值分配给res时,它就是您期望的数字。

a*b是整数,不是长整数。

因为它只是一个整数,所以它已经绕过了 32 位限制。
将此整数转换回 long 不会神奇地恢复该数据。

long res = a*b;

a*b将被视为整数,除非您在结尾(或)强制转换时添加“l”。

按照java教程

int 数据类型是 32 位有符号二进制补码整数。 它的最小值为-2,147,483,648,最大值为2,147,483,647(含)。 对于整数值,此数据类型通常是默认选择,除非有理由(如上述)选择其他类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM