自从我开始在euler项目中使用eclipse以来,我注意到大数字有时会变成一个看似随机的负数。我想这与通过这种类型的boudry有关。如果你能解释一下这些负数是如何产生的,以及背后的逻辑,我会很高兴的。另外,如何避免它们(最好不要使用biginteger类)。丹克!=)
bhmjp9jg1#
此图显示了您正在寻找的内容。在你的例子中,显然是更大的数字,但原理不变。java中的限制示例如下:int:−2147483648至2147483647。长:-9223372036854775808至9223372036854775807在图像0000、0001等中,显示了数字的二进制表示形式。编辑:在ProjectEuler中,您经常需要想出一种解决拉格数的方法。这些问题都是用大数字设计的,所以你不能用普通的方法来解决问题。但是,如果您发现确实需要使用它们,我建议您还是学习biginteger。从长远来看,你会发现它很有用,而且并不那么复杂。这里有一个链接,有很多可以理解的例子:biginteger例子
cbwuti442#
在数学中,数字是无限的。然而,在计算机中,它们不是。有 MAX_VALUE 每人 int -类似类型: int , short , long . 例如 Integer.MAX_VALUE . 当您尝试将数字增加到大于此值时,数字将变为负数。这样,数字的内部二进制表示就起作用了。
MAX_VALUE
int
short
long
Integer.MAX_VALUE
int i = Integer.MAX_VALUE; i++; // i becomes negative.
mnowg1ta3#
这是2位整数的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位。
ghhkc1vu4#
您可能溢出了数据类型的大小,因为最重要的位是符号位。我认为java没有 unsigned 数据类型,因此您可以尝试使用更大的数据类型,例如 long 如果你想拥有比你更大的数字 int . 如果您仍处于溢出状态 long 尽管如此,你还是被困在了 BigInteger .
unsigned
BigInteger
4条答案
按热度按时间bhmjp9jg1#
此图显示了您正在寻找的内容。在你的例子中,显然是更大的数字,但原理不变。
java中的限制示例如下:
int:−2147483648至2147483647。
长:-9223372036854775808至9223372036854775807
在图像0000、0001等中,显示了数字的二进制表示形式。
编辑:在ProjectEuler中,您经常需要想出一种解决拉格数的方法。这些问题都是用大数字设计的,所以你不能用普通的方法来解决问题。但是,如果您发现确实需要使用它们,我建议您还是学习biginteger。从长远来看,你会发现它很有用,而且并不那么复杂。这里有一个链接,有很多可以理解的例子:biginteger例子
cbwuti442#
在数学中,数字是无限的。然而,在计算机中,它们不是。有
MAX_VALUE
每人int
-类似类型:int
,short
,long
. 例如Integer.MAX_VALUE
. 当您尝试将数字增加到大于此值时,数字将变为负数。这样,数字的内部二进制表示就起作用了。mnowg1ta3#
这是2位整数的2补表示法:(u表示无符号,s表示有符号)
算术运算的完成方式与无符号情况下的模max(u)(在我们的情况下为4)大致相同。
对于较大的类型,逻辑是相同的。
int
在java中是32位的。使用long
对于64位。ghhkc1vu4#
您可能溢出了数据类型的大小,因为最重要的位是符号位。我认为java没有
unsigned
数据类型,因此您可以尝试使用更大的数据类型,例如long
如果你想拥有比你更大的数字int
. 如果您仍处于溢出状态long
尽管如此,你还是被困在了BigInteger
.