-2

为什么会像这样简单:

System.out.println("test problem: " + 194*194*194*409);

输出如下内容:

test problem: -1308701240
4

5 回答 5

11

因为你溢出了一个整数。请参阅 java 文档中对整数处理的数字的限制。

于 2013-04-18T13:36:12.187 回答
8

我不会给你直接的答案,而是建议一些步骤。

  • 算出你正在做的算术类型(文字 194 是什么类型?你使用的乘法运算符的结果是什么类型?)
  • 你期望答案是什么?
  • 您的结果类型可以处理该答案吗?
  • Java 对它无法处理的结果做了什么?

有关奖励积分,请参阅最后一部分的Java 语言规范...

于 2013-04-18T13:35:54.067 回答
2

15.17.1 开始。乘法运算符

如果整数乘法溢出,则结果是数学乘积的低位,以某种足够大的二进制补码格式表示。因此,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同。

我们有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.

一切都按预期工作!

于 2013-04-18T14:00:07.990 回答
1

看起来像操作结果的溢出。2.986.266.056 不是有效的 int 值。

于 2013-04-18T13:39:34.440 回答
-7

尝试首先进行数学运算,然后将结果转换为字符串。

于 2013-04-18T13:36:27.837 回答