这看似简单,但我没有任何答案。 我写的时候:
System.out.println (100 * 1000 * 10000 * 100000);
System.out.println (100 * 1000 * 10000 * 100000.0);
它返回这些值:
276447232
1.0E14
我知道这与某些数据类型的最大值有关。但我想要一个明确的答案,为什么它返回这两个方程的这些精确值。如果有人能向我解释这一点,我将非常感激。
第一个返回值与int数据类型的最大值不匹配,这就是为什么我感到困惑。我假设的第二个回报是双倍或浮动值,但我不确定。
答案 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
。