对SO的回应 我开始思考,JavaScript 是否能保证跨操作系统和浏览器的某种字节序编码?

或者换句话说,JavaScript 中整数的按位移位是“安全的”吗?

有帮助吗?

解决方案

是的,他们是安全的。虽然你没有得到的速度好处,你可能会希望,因为JS位操作是“一个黑客”。

其他提示

移位是安全的,但你的问题是有缺陷的,因为字节顺序无论如何都不会影响位移操作。在所有语言的大端和小端系统上左移都是相同的。(右移可能会有所不同,但这只是由于符号位的解释,而不是任何位的相对位置。)

仅当您可以选择将某些内存块解释为字节或更大的整数值时,字节序才会发挥作用。一般来说,Javascript 不会给你这个选项,因为你无法访问任意内存块,尤其是变量占用的内存块。 类型化数组 以字节序敏感的方式提供数据视图,但顺序取决于主机系统;对于所有可能的 Javascript 主机环境来说,它不一定相同。

字节序描述 身体的 存储顺序,不 逻辑的 存储顺序。从逻辑上讲,最右边的位是 总是 最低有效位。该位的字节是否是驻留在最低内存地址的字节是一个完全独立的问题,只有当您的语言公开“最低内存地址”这样的概念时才重要,而 Javascript 则不然。类型化数组可以,但仅限于类型化数组的上下文中;他们仍然不提供对任意数据存储的访问。

有些答案的日期,因为字节序的可以的使用类型数组时是相关的!考虑:

var arr32 = new Uint32Array(1);
var arr8 = new Uint8Array(arr32.buffer);
arr32[0] = 255;
console.log(arr8[0], arr8[1], arr8[2], arr8[3]);

当我在Chrome的控制台运行它,它产生255 0 0 0,这说明我的机器是little-endian的。然而,类型数组默认使用系统字节序,所以你可能会看到0 0 0 255,而不是如果你的机器是大端。

ECMA脚本并实际上具有整数类型的概念,但它是隐式强制或从浮点值作为必要双精度(如果所表示的数量过大或者如果它有一个小数部分)。

许多主流JavaScript解释器(SpiderMonkey的是一个例子)走捷径在实施和解释所有数值为加倍,以避免检查的实际本机类型为每个指令的值无关。作为实施黑客攻击的结果,位操作实现强制转换为整数类型,然后铸造回双表示。因此,它是不是在JavaScript中使用位级操作是一个好主意,你无论如何也不会获得性能提升。

  

是对整数偏移逐位 “安全” 在JavaScript?

仅用于配合在32位(31 +符号),该整数。不像,说,Python中,你不能得到1 << 40。

这是按位运算符是如何定义的由ECMA-262工作,即使JavaScript的数字实际上浮动。 (在技术上,双精度浮点数,给你尾数的52个比特,很容易地足以覆盖一个32位int的范围内。)

有不涉及在按位算术“端序”的问题,并在字节序可以参与没有字节存储格式是内置的JavaScript。

JavaScript没有整数类型,只有一个浮点型。你永远无法得到足够接近的实施细则担心这一点。

scroll top