ArrayBuffer 的 Binary 说明

ArrayBuffer's Binary clarification

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8

只是想在这里澄清一些事情,当这篇文章说:

The setInt8() method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the DataView.<<

然后你执行这段代码

var buffer = new ArrayBuffer(8);
var dataview = new DataView(buffer);
dataview.setInt8(1, 3);
dataview.setInt8(3, -3);

缓冲区实际上是:

[
00000000,
00000011,
00000000,
10000011,
00000000,
00000000,
00000000,
00000000
]

可能的最大数字是 127?

我想我已经用

确认了这一点
dataview.setInt8(1,128);
dataview.getInt8(1); // -127

但是......我很困惑为什么它会恢复......

dataview.setInt8(1, 255);
dataview.getInt8(1); // -1

dataview.setInt8(1, 257);
dataview.getInt8(1); // 1

因为 256 超出了 8 位整数的范围,所以 dataview.setInt8(1,257) 不应该出现错误吗?我只是想确认缓冲区实际上是我上面列出的二进制数组...所以如果将 8 位整数转换为 16 位整数,这会有所不同...谢谢!

如果你试试这个:

dataview.setInt8(1,1);
dataview.getInt16(1); // 256
dataview.setInt8(1,257);
dataview.getInt16(1); // 256

您可以确认 setInt8 仅写入缓冲区的一个字节,即使给定的输入值超过 8 位也是如此。所以你在那里很安全。

奇怪的是 .setInt8().setUint8() 似乎是相同的功能(在 Chrome 上,这是我尝试过的唯一浏览器)。 .setInt8(1,255).setUint8(1,-1) return 都不是错误,.setInt8(1,-1).setUint8(1,-1) 具有相同的效果。

此外,您还询问了 'with the highest number possible being 127?'。是的,如果您正在使用 getInt8() 读取缓冲区。使用 getUint8()getInt16() 等读取它可能 return 高于 127 的值。与 set 函数不同,get 函数似乎(正确地)在签名方面表现不同。

从空缓冲区开始,如果执行:

dataview.setInt8(1,3);
dataview.setInt8(3,3);

缓冲区将包含:

00000000 00000011 00000000 11111101

您可以通过尝试验证这一点:

dataview.getInt32(0); // 196861 = 110000000011111101

负数在缓冲区

中通过Two's Complement表示