我有一个使用 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 编译器