8

我有这样的代码:

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

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

4

3 回答 3

8

您必须将赋值语句分解为各个部分以了解正在执行的操作:

long res = a*b;

第 1 步是获取 和 的ab

第 2 步是评估a * b. 因为ab都是ints,所以这是一个int乘法。所以我们乘以629339which629339将是2577772544。不幸的是,2577772544大于最大可能的 Javaint值......所以乘法运算会悄悄溢出......我们得到-1717194752了相反的结果。

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


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

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

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

于 2012-10-12T15:21:47.077 回答
7

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

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

于 2012-10-12T15:04:16.020 回答
5
long res = a*b;

a*b将被视为整数,除非您在结尾(或)演员表中添加“l”。

按照java教程

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

于 2012-10-12T15:04:57.213 回答