java—通常大数字变成负数

q5lcpyga  于 2021-08-20  发布在  Java
关注(0)|答案(4)|浏览(525)

自从我开始在euler项目中使用eclipse以来,我注意到大数字有时会变成一个看似随机的负数。我想这与通过这种类型的boudry有关。
如果你能解释一下这些负数是如何产生的,以及背后的逻辑,我会很高兴的。另外,如何避免它们(最好不要使用biginteger类)。丹克!=)

bhmjp9jg

bhmjp9jg1#

此图显示了您正在寻找的内容。在你的例子中,显然是更大的数字,但原理不变。
java中的限制示例如下:
int:−2147483648至2147483647。
长:-9223372036854775808至9223372036854775807
在图像0000、0001等中,显示了数字的二进制表示形式。

编辑:在ProjectEuler中,您经常需要想出一种解决拉格数的方法。这些问题都是用大数字设计的,所以你不能用普通的方法来解决问题。但是,如果您发现确实需要使用它们,我建议您还是学习biginteger。从长远来看,你会发现它很有用,而且并不那么复杂。这里有一个链接,有很多可以理解的例子:biginteger例子

cbwuti44

cbwuti442#

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

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

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位。

ghhkc1vu

ghhkc1vu4#

您可能溢出了数据类型的大小,因为最重要的位是符号位。我认为java没有 unsigned 数据类型,因此您可以尝试使用更大的数据类型,例如 long 如果你想拥有比你更大的数字 int . 如果您仍处于溢出状态 long 尽管如此,你还是被困在了 BigInteger .

相关问题