gpt4 book ai didi

java相当于unsigned long long不就是BigInteger吗?

转载 作者:行者123 更新时间:2023-12-03 23:12:15 39 4
gpt4 key购买 nike

我有一个使用 unsigned long long 的简单 C 代码:

#include<stdlib.h>
unsigned long long get_random_id(const char *imeiId)
{
const unsigned long long MULT = 2862933555777941757LL;
const unsigned long long ADDEND = 3037000493LL;
unsigned long long newId, oldId;
oldId = atoll(imeiId);
newId = MULT * oldId + ADDEND;
return newId;
}
void main()
{
printf("%llu",get_random_id("351746051295833"));
}

我应该将其转换为 java 代码,所以我按如下方式使用 BigInteger:

public static void main(String args[]) {
System.out.println(get_random_id("351746051295833"));
}
static BigInteger get_random_id(String imeiId) {
final String MULT_STRING = "2862933555777941757";
final String ADDEND_STRING = "3037000493";

BigInteger MULT = new BigInteger(MULT_STRING);
BigInteger ADDEND = new BigInteger(ADDEND_STRING);
BigInteger oldId = new BigInteger(imeiId);
BigInteger temp = MULT.multiply(oldId);
BigInteger newId = temp.add(ADDEND);
return newId;
}

我的问题是我没有为 Java 和 C 代码获得相同的输出。对于 C 代码,我得到 10076018645131828514。而对于 Java 代码,我得到 1007025573367229468539210487799074。

我无法理解相同输入的这些不同输出。

PS:我在 Ubuntu 32 位机器上运行代码并使用 gcc 编译器

最佳答案

unsigned long long 是一种有限长度的整数格式(可能是 64bit or more )。这意味着它不能容纳大于 264-1 的值。

BigInteger 是一种任意长度的整数格式。这意味着存储在 BigInteger 中的数字的大小实际上仅受可用内存的限制(以及一些 JVM 限制,例如数组的大小,但这些限制非常大)。

在 C 程序的计算中,unsigned long long 可能会溢出,您会得到一个截止结果。

BigInteger 不会发生这种情况(它永远不会悄无声息地溢出),它只会给出准确的结果。

您可以通过创建一个包含所需位掩码(64 个设置位)的 BigInteger 并使用 myValue.and(MASK) 来模拟溢出"结果。

不过,您必须在可能发生溢出的每一步都这样做。而且它肯定会比 C 代码慢。

关于java相当于unsigned long long不就是BigInteger吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19949725/

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