遗憾的是,正确答案是 Javascript 不支持 64 位整数(直到现在)。
因此,尝试将精确的 64 位整数存储到您的 8 个字节中到单个 JS 数字类型变量中将失败。反正。
一些决定:
- 从 0 到 52 的精确位:
如果您不需要 64 位的高 11 位,并且足以处理精确的 53 位整数,则可以使用这种方式:
// puts up to 53 bits by 32bit integers to one "64bit" integer
var bufInt = (buf.readUInt32BE(0) & 0x001FFFFF) * 4294967296 + buf.readUInt32BE(4);
(已编辑问题)
- "64bit" int 可能会丢失低 11 位正确状态:
否则,如果您需要 64 位的“通用大值”,并且您对直到 11 个低位(巨大 64 位值的最右边 2-3 位)的精确值不感兴趣,您可以使用这种方式:
// puts 64 bit value by 32bit integers to one "64bit" integer
// with possible loose of lower 11 bits correctness
var bufInt = buf.readUInt32BE(0) * 4294967296 + buf.readUInt32BE(4);
对于那些对 Javascript 中的 int64(64 位整数支持)感兴趣的人,请注意!
看:
var x1 = 1 << 30;
var x2 = 1 << 31;
var x3 = 1 << 32;
var x4 = 1 << 33;
var a = 1240611072103715194;
var b = 1240611072103715193;
var c = 1240611072103700000;
alert(''
+ 'x1=' + x1 + ' (should =1073741824)\n'
+ 'x2=' + x2 + ' (should =2147483648)\n'
+ 'x3=' + x3 + ' (should =4294967296)\n'
+ 'x4=' + x4 + ' (should =8589934592)\n'
+ 'a=' + a + ' (should =1240611072103715194)\n'
+ 'a-b=' + (a-b) + ' (should =1)\n'
+ 'a-c=' + (a-c) + ' (should =15194)\n'
);
RESULT:
x1=1073741824 (should =1073741824)
x2=-2147483648 (should =2147483648)
x3=1 (should =4294967296)
x4=2 (should =8589934592)
a=1240611072103715000 (should =1240611072103715194)
a-b=0 (should =1)
a-c=15104 (should =15194)