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 コンパイラを使用しています。