gpt4 book ai didi

java - java中大数相乘

转载 作者:行者123 更新时间:2023-12-01 21:09:08 24 4
gpt4 key购买 nike

我在java中将2相乘,但乘法输出似乎有点奇怪
代码

long a =  2539586720l;
long b = 77284752003l;
a*=b;
System.out.println(a);
a=(long)1e12;
b=(long)1e12;
a*=b;
System.out.println(a);

输出:

-6642854965492867616
2003764205206896640

第一种情况为什么结果是负数,如果是因为溢出那么为什么第二种情况结果是正数?请解释一下这种行为? Code

Edit:

我正在使用mod=100000000009操作,它仍然是负数吗?

  a = ((a%mod)*(b%mod))%mod

最佳答案

对于 long,您得到的结果通常是溢出问题:java 为数字分配 63 位,为符号分配最高有效位 (MSB) (0 表示正值,1 表示负值)因此总共 64 位。

因此,Long.MAX_VALUE + 1 等于 -9223372036854775808,因为 Long.MAX_VALUE = 2^63 - 1 = 9223372036854775807 = 0x7ffffffffffffffffL 所以如果我们添加 1 到它,我们得到 0x8000000000000000L= Long.MIN_VALUE = -2^63 = -9223372036854775808。在这种情况下,MSB 从 0 切换到 1,因此结果为负,这实际上是您在第一个用例中得到的结果。

如果 MSB 设置为 1 并且您通过某些计算导致新的溢出,它将再次切换到 0 (因为我们只保留第一个 64 位),因此结果将为正,这实际上是您在第二个用例中得到的结果。

为避免这种情况,您需要使用 BigInteger

关于java - java中大数相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41574870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com