Nodejs 中 64 位整数表示
Nodejs 中 64 位整数表示
需要从 Buffer 里读出来一个 64 位的整数,发现 JS 最大精确的整数< 64 位,所以不提供 readUint64BE 的方法。如果用 bignum 处理就太麻烦,所有相关的四则运算都得改写成函数调用。
幸好 Buffer 里的数字也没有超过 JS 最大的整数值,所以就用 JS 的整数简单代替了一下,一旦发现 Buffer 这个值的高位超过了最大整数的高位就直接报错了事。
大家都是怎么处理这种问题的
js 里面是 float64,可以精确涵盖 int53 范围的整数,如果够用就用 js 内置的浮点数就行了
有个 long.js
可以把 buffer 转成 long 对象,分 high、low,还可以.toString
是 64 位的偏移量,指向文件内的一个位置,浮点肯定不行。
这个跟 bignum 的问题一样,要用它的方法代替运算符,不过这可能是 js 上的唯一方式。
不知道 typescript 有没有 64 位的强类型,或者要考虑 webassembly 了。
30bit 是 1GB, 40bit 是 1TB, 50bit 是 1PB, 指向文件内的一个位置很小的,
int53 足够表示, 这是 double 型能精确表示的整数区域.
现在就得改成函数调用;将来的话,有个 stage-3 的提案 https://github.com/tc39/proposal-bigint
确实,忘记算一下了,暂时用 js 的整数不会出问题。
这个不知道啥时候能成正式的标准,而且说混合普通数值运算会丢精度,这就有点坑了。
53 位的整数看上去还不错,一般见不到那么大的文件。
#8 仔细看,他说的是因为混合运算会丢精度,所以不允许混合运算,要你手动调用 Number()或 BigInt()来转换类型再运算
在 Node.js 中,JavaScript 原生并不直接支持 64 位整数,因为 JavaScript 的 Number
类型遵循双精度 64 位浮点数格式(IEEE 754),这导致它只能精确表示到 53 位二进制数(约 15-17 位十进制数)。对于需要精确表示更大范围的整数,特别是 64 位整数,你可以使用 BigInt
类型或者第三方库。
使用 BigInt
BigInt
是一种内置对象,提供了一种方法来表示大于 2^53 - 1
或小于 -(2^53 - 1)
的整数。BigInt
通过在整数后面添加 n
来表示。
示例代码:
const bigInt64 = 9007199254740991n; // 2^53 - 1
const anotherBigInt = 123456789012345678901234567890n;
console.log(bigInt64); // 输出: 9007199254740991n
console.log(anotherBigInt); // 输出: 123456789012345678901234567890n
使用第三方库(如 node-int64
)
如果你需要更多关于 64 位整数的操作(如位运算),可以使用第三方库,如 node-int64
。
安装:
npm install node-int64
使用示例:
const Int64 = require('node-int64');
const int64Value = new Int64(1234567890123456789);
console.log(int64Value.toString()); // 输出: 1234567890123456789
console.log(int64Value.toBuffer().toString('hex')); // 转换为十六进制表示
这两种方法都能帮助你在 Node.js 中表示和处理 64 位整数。