通常大数字变为负数

时间:2013-06-20 16:32:16

标签: java biginteger integer-overflow

自从我开始将eclipse用于项目euler以来,我注意到大数字有时会变成看似随机的负数。我想这与传递类型的boudry有关。

如果你能向我解释这些负数是如何产生的,以及它背后的逻辑是什么,我会很高兴的。另外,我怎样才能避免它们(最好不要使用BigInteger类)。丹科!=)

4 个答案:

答案 0 :(得分:14)

此图像显示了您要查找的内容。在你的情况下,它显然是更大的数字,但原则保持不变。

java中限制的例子有:
int:-2,147,483,648至2,147,483,647。
长:-9,223,372,036,854,775,808至9,223,372,036,854,775,807

在图像0000,0001等中,显示数字的二进制表示。

Image explaining two's complement

编辑:在项目euler中,你经常需要考虑一种解决滞后数字的方法。这些问题的设计数字很大,因此您无法使用普通的问题解决方法。但是,如果您发现确实需要使用它们,我建议无论如何都要研究BigInteger。从长远来看,你会发现它很有用,并不是那么复杂。这是一个包含许多可以理解的例子的链接: BigInteger Example

答案 1 :(得分:3)

这是2位整数的two's complement表示:(U表示无符号,S表示已签名)

 U | bits |  S
---------------
 0 |  00  |  0 
 1 |  01  |  1 \ overflow here:
 2 |  10  | -2 /   1 + 1 = -2
 3 |  11  | -1

算术主要就像在无符号情况下一样,以模数max(U)(在我们的例子中为4)。

对于更大的类型,逻辑是相同的。 Java中的int是32位。使用long 64位。

答案 2 :(得分:1)

在数学中,数字是无限的。但是在计算机中他们不是。每个MAX_VALUE都有int个类似:intshortlong。例如Integer.MAX_VALUE。当您尝试增加超过此值的数字时,该数字变为负数。这样,数字的内部二进制表示起作用。

int i = Integer.MAX_VALUE;
i++; // i becomes negative. 

答案 3 :(得分:1)

您可能会溢出数据类型的大小,因为最重要的位是符号位。我认为Java不具有unsigned数据类型,因此如果您希望保留大于long的数字,则可以尝试使用更大的数据类型,例如int。如果你仍然在long但仍然满溢BigInteger