自从我开始在项目 euler 中使用 eclipse 以来,我注意到大数字有时会变成看似随机的负数。我想这与传递类型的边界有关。
如果您能向我解释这些负数是如何产生的以及它背后的逻辑是什么,我会很高兴。另外,我怎样才能避免它们(最好不要使用 BigInteger 类)。丹克!=)
自从我开始在项目 euler 中使用 eclipse 以来,我注意到大数字有时会变成看似随机的负数。我想这与传递类型的边界有关。
如果您能向我解释这些负数是如何产生的以及它背后的逻辑是什么,我会很高兴。另外,我怎样才能避免它们(最好不要使用 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 中,您经常必须想办法解决 lagre 数字。这些问题设计的数字很大,以至于您无法使用普通的解决问题的方法。但是,如果您发现确实需要使用它们,我建议还是学习 BigInteger。从长远来看,您会发现它很有用,而且并不那么复杂。这是一个包含许多可理解示例的链接: BigInteger Example
在数学中,数字是无限的。但是在计算机中它们不是。MAX_VALUE
每种int
类型都有: int
, short
, long
. 例如Integer.MAX_VALUE
. 当您尝试将数字增加超过此值时,数字变为负数。这样,数字的内部二进制表示就起作用了。
int i = Integer.MAX_VALUE;
i++; // i becomes negative.
这是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 位的。用于long
64 位。
您可能溢出了数据类型的大小,因为最高有效位是符号位。我不认为 Java 具有unsigned
数据类型,因此您可以尝试使用更大的数据类型,例如long
如果您想保存比int
. 如果您仍然溢出 a long
,那么您几乎被困在BigInteger
.