JavaScript 类型数组 - 不同的视图

JavaScript Typed Arrays - Different Views

本文关键字:视图 类型 数组 JavaScript      更新时间:2023-09-26

我正在尝试处理不同类型的类型化数组之间的交互。

例 1.

var buf = new ArrayBuffer(2);
var arr8 = new Int8Array(buf);
var arr8u = new Uint8Array(buf);
arr8[0] = 7.2;
arr8[1] = -45.3;
console.log(arr8[0]);       // 7
console.log(arr8[1]);       // -45
console.log(arr8u[0]);      // 7
console.log(arr8u[1]);      // 211

我对前三个读数没有问题,但是最后一个读数的 211 从何而来。这是否与减号的位移有关。

例 2

var buf = new ArrayBuffer(4);
var arr8 = new Int8Array(buf);
var arr32 = new Int32Array(buf);
for (var i = 0; i < buf.byteLength; i++){
    arr8[i] = i;
}
console.log(arr8);      // [0, 1, 2, 3]
console.log(arr32);     // [50462976]

那么50462976从何而来呢?

示例 #1

将正 45 检查为二进制数:

> (45).toString(2)
"101101"
二进制

值使用二进制补码取反:

00101101 => 45 signed 8-bit value
11010011 => -45 signed 8-bit value

当我们读取时,我们将11010011读取为无符号的 8 位值,结果为211

> parseInt("11010011", 2);
211

示例 #2

如果以基数 2 打印50462976

> (50462976).toString(2);
"11000000100000000100000000"

我们可以添加前导零并将其重写为:

00000011000000100000000100000000

我们可以将其分解为八位字节:

00000011 00000010 00000001 00000000

这显示了二进制3210。32 位整数的存储是大端序的。构造 32 位值时,将按重要性递增的顺序读取 8 位值 0 到 3。

第一个问题。

有符号 8 位整数的范围从 -128 到 127。正部分 (0-127) 映射到从 0000000001111111 的二进制值,另一半 (-128-1) 映射到从 1000000011111111 的二进制值。

如果省略第一位,则可以通过向边界添加 7 位数字来创建数字。在您的情况下,二进制表示形式为 11010011 。第一位是1,这意味着该数字将是负数。最后7位是1010011的,这给了我们价值83。将其添加到边界:-128 + 83 = -45 。就是这样。

第二个问题。

32 位整数由内存中的四个字节表示。您将在缓冲区中存储四个 8 位整数。当转换为Int32Array时,所有这些值被组合成一个值。

如果这是十进制系统,您可以将其视为组合"1"和"2"得到"12"。在这种情况下,它是相似的,只是乘数不同。对于第一个值,它是 2^24 。然后是2^16,然后是2^8,最后是2^0.让我们来计算一下:

2^24 * 3 + 2^16 * 2 + 2^8 * 1 + 2^0 * 0 =
16777216 * 3 + 65536 * 2 + 256 * 1 + 1 * 0 =
50331648 + 131072 + 256 + 0 =
50462976

这就是为什么你看到这么大的数字。