15

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

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

4

4 回答 4

18

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

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 中,您经常必须想办法解决 lagre 数字。这些问题设计的数字很大,以至于您无法使用普通的解决问题的方法。但是,如果您发现确实需要使用它们,我建议还是学习 BigInteger。从长远来看,您会发现它很有用,而且并不那么复杂。这是一个包含许多可理解示例的链接: BigInteger Example

于 2013-06-20T16:51:13.730 回答
4

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

int i = Integer.MAX_VALUE;
i++; // i becomes negative. 
于 2013-06-20T16:36:58.090 回答
3

这是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)。

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

于 2013-06-20T16:46:48.680 回答
1

您可能溢出了数据类型的大小,因为最高有效位是符号位。我不认为 Java 具有unsigned数据类型,因此您可以尝试使用更大的数据类型,例如long如果您想保存比int. 如果您仍然溢出 a long,那么您几乎被困在BigInteger.

于 2013-06-20T16:38:55.390 回答