12

对 SO 的回应让我想到,JavaScript 是否保证跨操作系统和浏览器的某种字节序编码?

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

4

6 回答 6

35

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

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

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

于 2009-02-02T17:35:46.533 回答
12

其中一些答案已经过时,因为在使用类型化数组时字节序可能是相关的!考虑:

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您的机器是否为大字节序。

于 2012-12-05T22:39:00.850 回答
6

是的,他们是安全的。尽管由于 JS 位操作是“黑客” ,因此您没有获得您可能希望的速度优势。

于 2009-02-02T17:23:27.900 回答
4

ECMA 脚本确实有整数类型的概念,但它在必要时被隐式强制转换为双精度浮点值或从双精度浮点值强制转换(如果表示的数字太大或如果它具有小数部分)。

许多主流的 Javascript 解释器(SpiderMonkey 就是一个例子)在实现中采取了一种捷径,将所有数值解释为双精度值,以避免检查每条指令的值的实际本机类型。作为实现 hack 的结果,位操作被实现为强制转换为整数类型,然后再强制转换为双精度表示。因此,在 Javascript 中使用位级操作并不是一个好主意,而且无论如何您都不会获得性能提升。

于 2009-02-02T17:44:07.997 回答
3

JavaScript中整数的按位移位是“安全的”吗?

仅适用于适合 32 位(31+符号)的整数。不像 Python,你不能得到 1<<40。

这就是 ECMA-262 定义按位运算符工作的方式,即使 JavaScript 数字实际上是浮点数。(从技术上讲,双精度浮点数,为您提供 52 位尾数,足以轻松覆盖 32 位整数的范围。)

在按位算术中不存在“字节顺序”问题,并且 JavaScript 中没有内置可能涉及字节顺序的字节存储格式。

于 2009-02-02T17:31:57.600 回答
0

JavaScript 没有整数类型,只有浮点类型。您永远无法接近实现细节来担心这一点。

于 2009-02-02T17:24:04.683 回答