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