Да, readDouble () здесь бесполезно, оно будет интерпретировать ваше 64-битное целое как форматированное с плавающей запятой IEEE 754 с плавающей запятой (знаковый бит + 11 экспонентных бит + 52 дробных бита), и это получитВы - результат мусора.
(Число (мсб) * Math.pow (2, 32)) + Число (lsb) не является полным решением, если вам нужно поддерживать отрицательные числа,Этот код получает правильный результат только в том случае, если ваш номер равен нулю или положительное число не превышает 2 ^ 63-1 (например, бит знака не установлен).Если бит знака установлен, ваш код будет эффективно интерпретировать 64 бита как целое число без знака, а это не то, что отправляет вам Java.Если вы используете свое решение и задаетесь вопросом, почему вы всегда получаете положительный результат, вот почему.
Возможно, есть действительно крутой трюк для поддержки отрицательных и положительных чисел в одной строке кода, нопотому что я не могу решить это прямо сейчас, я скажу вам простой способ, которым я вижу решение в моей голове:
Я бы использовал msb & 0x80000000 , чтобы прочитать знакнемного.Если он не установлен, используйте формулу выше.Если он установлен, сначала преобразуйте число из дополнительного формата 2 в формат без знака:
msb = (msb ^ 0xFFFFFFFF);
lsb = (lsb^ 0xFFFFFFFF) + 1;
Затем примените ваш форум к msb и lsb и (поскольку бит знака был установлен) умножьте полученное число на -1.
if (msb & 0x80000000)
{
msb ^= 0xFFFFFFFF;
lsb ^= 0xFFFFFFFF;
result = -(Number(msb)*4294967296 + Number(lsb) + 1);
}
else
{
result = Number(msb)*4294967296 + Number(lsb);
}