JavaScript Endian编码?

All*_*nde 11 javascript encoding bit-manipulation endianness

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

或者换一种方式是在JavaScript中对整数"安全"进行按位移位?

Rob*_*edy 31

移位是安全的,但你的问题是有缺陷的,因为无论如何,字节顺序不会影响位移操作.在所有语言的big-endian和little-endian系统中,左移是相同的.(右移可能不同,但仅由于符号位的解释,而不是任何位的相对位置.)

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

Endianness描述物理存储顺序,而不是逻辑存储顺序.从逻辑上讲,最右边的位始终是最低位.该位的字节是否位于最低内存地址是一个完全独立的问题,只有当您的语言暴露出"最低内存地址"这样的概念时才会发生这种情况,而Javascript则不然.类型化数组,但仅在类型化数组的上下文中; 他们仍然无法访问任意数据的存储.


Mik*_*sey 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]);
Run Code Online (Sandbox Code Playgroud)

当我在Chrome的控制台中运行它时,它会产生255 0 0 0,表明我的机器是小端的.但是,默认情况下,类型化数组使用系统字节顺序,因此您可能会看到0 0 0 255您的计算机是否为big-endian.

  • 为什么不呢?这正是[正是草案规范应该做的](http://www.khronos.org/registry/typedarray/specs/latest/#2.1). (4认同)
  • 你真的认为 Chrome 会将其推迟到本地系统吗?我觉得有点难以下咽。 (2认同)

Mic*_*ren 6

是的,他们很安全.虽然你没有获得速度优势,但你可能希望因为JS位操作是" 黑客 ".

  • 我读了那个链接.我不同意其中一些.关于做一个〜0的一点似乎有误导性.你得到32位,它总是签名. (2认同)

小智 5

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

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