关于将8字节(u64)无符号整数转换为javascript的建议



我有一个u64(无符号整数(存储在8字节的内存中。显然,范围是0-2^64个整数。

我通过将每个字节转换为十六进制并生成一个十六进制字符串将其转换为javascript数字:

let s = '0x'
s += buffer.slice(0,1).toString("hex")
s += buffer.slice(1,2).toString("hex")
...
n = parseInt(s)

对我迄今为止所做的一切都很有效。

但当我看到javascript如何存储数字时,我变得不确定了。Javascript使用8字节表示数字,但对所有数字都一视同仁。这个内部javascript"数字";表示法也可以包含浮点数。

javascript数字可以存储从0到2^64的所有整数吗?似乎不是。

我什么时候会遇到麻烦?人们会做些什么来避开这种情况?

无符号64位整数的范围为0到18.446.744.073.709.551.615。

您可以将Number包装对象与.MAX_VALUE属性一起使用,它表示JavaScript中可表示的最大数值

JavaScriptNumber类型是一个双精度64位二进制格式IEEE 754值,类似于Java或C#中的double。

一般信息:

JS中的整数:

JavaScript只有浮点数。整数以两种方式出现在内部。首先,大多数JavaScript引擎存储一个足够小的数字,没有小数作为整数(例如,31位(,并尽可能长时间地保持这种表示。如果一个数字的幅度变得太大或出现小数,他们必须切换回浮点表示。其次,ECMAScript规范有整数运算符:即所有的按位运算符。这些运算符将其操作数转换为32位整数并返回32位整数。对于规范,整数仅表示数字没有小数,32位表示数字在一定范围内。对于引擎来说,32位整数意味着通常可以引入或维护实际的整数(非浮点(表示。

整数范围

在内部,以下整数范围在JavaScript中很重要:

  • 安全整数[1],JavaScript支持的最大实际可用整数范围:53位加上一个符号,范围(−2^53,2^53(,与(+/-(9.007.199.254.740.992有关
  • 数组索引[2]:32位,无符号最大长度:2^32−1索引范围:[0,2^32−1((不包括最大长度!(
  • 按位操作数[3]:无符号右移运算符(>>(:32位,无符号,范围[0,2^32(所有其他按位运算符:32位,包括一个符号,范围[−2^31,2^31(
  • "字符代码",UTF-16代码单位为数字:已被String.fromCharCode((接受String.protype.charCodeAt((返回16位,无符号

参考文献:

[1] JavaScript 中的安全整数

[2] JavaScript 中的数组

[3] 按位标记(_O(

来源:https://2ality.com/2014/02/javascript-integers.html

最新更新