通常大数字变为负数

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

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

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

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示例

这是2位整数的二进制补码表示:(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位。 使用64位long

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

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

您可能会溢出数据类型的大小,因为最重要的位是符号位。 我不认为Java有unsigned数据类型,所以你可以尝试使用更大的数据类型,如果你想要保存比int更大的数字。 如果你仍然徘徊了long ,你几乎坚持使用BigInteger