为什么在一种情况下乘以大数字会产生错误的结果?

时间:2017-04-26 20:45:05

标签: java int multiplication primitive

这看似简单,但我没有任何答案。 我写的时候:

 System.out.println (100 * 1000 * 10000 * 100000);
 System.out.println (100 * 1000 * 10000 * 100000.0);

它返回这些值:

276447232
1.0E14

我知道这与某些数据类型的最大值有关。但我想要一个明确的答案,为什么它返回这两个方程的这些精确值。如果有人能向我解释这一点,我将非常感激。

第一个返回值与int数据类型的最大值不匹配,这就是为什么我感到困惑。我假设的第二个回报是双倍或浮动值,但我不确定。

1 个答案:

答案 0 :(得分:4)

在表达式

System.out.println (100 * 1000 * 10000 * 100000);

参数为int,结果超出了int 2147483647允许的最大值。这就是我们所说的溢出。根据{{​​3}}

  

如果整数乘法溢出,则结果是数学乘积的低位,用一些足够大的二进制补码格式表示。

取一个数的N个低位相当于计算该数除以2 ^ N的余数。在我们的例子中,N = 32因为int存储在32位上。这就是为什么Jon Skeet回答说

  

100000000000000 % (2^32)是276447232。

在表达式

System.out.println (100 * 1000 * 10000 * 100000.0);

三个第一因子100 * 1000 * 10000的乘积给出1_000_000_000,其小于最大int值。最后一次乘法导致Java Language Specification,这意味着,在这种情况下,1_000_000_000被转换(提升)为double,然后乘以100000.0