为什么会像这样简单:
System.out.println("test problem: " + 194*194*194*409);
输出如下内容:
test problem: -1308701240
为什么会像这样简单:
System.out.println("test problem: " + 194*194*194*409);
输出如下内容:
test problem: -1308701240
因为你溢出了一个整数。请参阅 java 文档中对整数处理的数字的限制。
我不会给你直接的答案,而是建议一些步骤。
有关奖励积分,请参阅最后一部分的Java 语言规范...
如果整数乘法溢出,则结果是数学乘积的低位,以某种足够大的二进制补码格式表示。因此,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同。
我们有194*194*194*409=2986266056
在二进制中,结果是1011 0001 1111 1110 1100 1101 1100 1000
最后 32 位是1011 0001 1111 1110 1100 1101 1100 1000
,因此我们没有因溢出而丢失任何位,但符号已更改。
由于int
用二进制补码( Source ) 表示,因此结果为
2^32 - 2986266056 = -1308701240
.
一切都按预期工作!
看起来像操作结果的溢出。2.986.266.056 不是有效的 int 值。
尝试首先进行数学运算,然后将结果转换为字符串。