自从我开始将eclipse用于项目euler以来,我注意到大数字有时会变成看似随机的负数。我想这与传递类型的boudry有关。
如果你能向我解释这些负数是如何产生的,以及它背后的逻辑是什么,我会很高兴的。另外,我怎样才能避免它们(最好不要使用BigInteger类)。丹科!=)
答案 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等中,显示数字的二进制表示。
编辑:在项目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
个类似:int
,short
,long
。例如Integer.MAX_VALUE
。当您尝试增加超过此值的数字时,该数字变为负数。这样,数字的内部二进制表示起作用。
int i = Integer.MAX_VALUE;
i++; // i becomes negative.
答案 3 :(得分:1)
您可能会溢出数据类型的大小,因为最重要的位是符号位。我认为Java不具有unsigned
数据类型,因此如果您希望保留大于long
的数字,则可以尝试使用更大的数据类型,例如int
。如果你仍然在long
但仍然满溢BigInteger
。