关于将8字节(u64)无符号整数转换为javascript的建议
我有一个u64(无符号整数)存储在8字节的内存中。很明显,范围是0-2^64个整数 通过将每个字节转换为十六进制并生成十六进制字符串,我将其转换为javascript数字:关于将8字节(u64)无符号整数转换为javascript的建议,javascript,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
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 您可以将数字包装器对象与.MAX_VALUE属性一起使用,它表示JavaScript中可表示的最大数值 JavaScript数字类型是双精度64位二进制格式IEEE 754值,类似于Java或C#中的双精度 一般信息: 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.prototype.charCodeAt()返回 16位,无符号
来源:双精度是52位+指数+符号。