function intFromBytes( x ){
var val = 0;
for (var i = 0; i < x.length; ++i) {
val += x[i];
if (i < x.length-1) {
val = val << 8;
}
}
return val;
}
function getInt64Bytes( x ){
var bytes = [];
var i = 8;
do {
bytes[--i] = x & (255);
x = x>>8;
} while ( i )
return bytes;
}
我正在尝试将 javascript 数字转换为字节数组,然后再转换回数字。但是,上述函数会产生非常大的错误输出。
var array = getInt64Bytes(23423423);
var value = intFromBytes(array);
console.log(value); //Prints 23423423 - correct
var array = getInt64Bytes(45035996273704);
var value = intFromBytes(array);
console.log(value); //Prints -1030792152 - incorrect
据我了解,javascript 浮点数是 53
位,所以它不应该溢出? alert(Math.pow(2,53))
工作正常。
原文由 user75832 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 JavaScript 中,移位(
>>
,<<
)总是对带符号的 32 位整数执行。这会导致大数的范围溢出。