1

几天前我发布了几个关于这个的问题,并得到了一些很好的回复JavaScript Typed Arrays - Different Views

我的第二个问题涉及两个视图,8 位数组和 32 位缓冲区数组。通过在 8 位中放置 0、1、2、3,我在 32 位中得到了 50462976。如前所述,32 位值的原因得到了很好的解释。

我可以使用以下代码实现相同的目的:

var buf = new ArrayBuffer(4);
var arr8 = new Int8Array(buf);
var arr32 = new Int32Array(buf);

for (var x = 0; x < buf.byteLength; x++) {
    arr8[x] =
        (x << 24) |
        (x << 16) |
        (x <<  8) |
         x;
}

console.log(arr8);      // [0, 1, 2, 3]
console.log(arr32);     // [50462976]

我找不到任何解释这个过程的机制的东西。似乎是说每个 arr8 元素等于 X 位移位 24 位或位移位 16 位或位移位 8 位或未位移位。

这对我来说真的没有意义。如果有人能对此有所了解,我将不胜感激。谢谢,

4

2 回答 2

3

基本上,您的缓冲区是这样的:

00000000 00000001 00000010 00000011

当作为 处理时Int8Array,它单独读取每个 8 位组:0、1、2、3

当作为 处理时Int32Array,它读取 32 位组(即 4 个 8 位组)以获得 50462976

于 2013-11-04T18:54:41.610 回答
2

缓冲区使用的内存被解释为 8 位字节Int8Array和 32 位字Int32Array。8 位数组中字节的顺序与另一个数组中单个 32 位字中字节的顺序相同,因为它们是相同的 bytes。不涉及“机制”;这只是查看相同 4 字节内存的两种方式。

int如果你分配一个四字节数组然后创建一个指向相同位置的指针,你会在 C 中得到完全相同的效果。

此外,这里的表达式:

arr8[x] =
    (x << 24) |
    (x << 16) |
    (x <<  8) |
     x;

会做同样的事情

arr8[x] = x;

x当值实际保存到(8 位)数组元素中时,您将 up 的值移动到将被截断的范围。

于 2013-11-04T18:53:54.833 回答