У меня есть простой код C, который использует беззнаковое долго долго:Явный эквивалент невыполненного длинного длинного не BigInteger?
#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 Code. Для кода C, я получаю 10076018645131828514. while для Java-кода я получаю 1007025573367229468539210487799074.
Я не могу понять эти разные выходы для того же входа.
PS: Я бег кода на Ubuntu 32-битной машину и с помощью GCC компилятора
Ответ от вашей программы на C слишком короткий. Сколько бит на вашей платформе длится без знака? Как бы то ни было, этого недостаточно, чтобы ответить. –