1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

docs(arrayBuffer): TypedArray数组的溢出

This commit is contained in:
ruanyf 2016-03-23 14:29:20 +08:00
parent d2fca7f2a1
commit 96c3de7eaa

View File

@ -464,9 +464,9 @@ function str2ab(str) {
### 溢出
不同的视图类型,所能容纳的数值范围是确定的。超出这个范围,就会出现溢出。
不同的视图类型,所能容纳的数值范围是确定的。超出这个范围,就会出现溢出。比如8位视图只能容纳一个8位的二进制值如果放入一个9位的值就会溢出。
TypedArray数组对于溢出采用的处理方法是求余值。正向溢出overflow的含义是输入值大于当前数据类型的最大值最后得到的值就等于当前数据类型的最小值加上余值再减去1负向溢出underflow等于当前数据类型的最大值减去余值再加上1
TypedArray数组的溢出处理规则,简单来说,就是抛弃溢出的位,然后按照视图类型进行解释
```javascript
var uint8 = new Uint8Array(1);
@ -478,9 +478,16 @@ uint8[0] = -1;
uint8[0] // 255
```
上面例子中8位无符号整数的数值范围是0到255超出这个范围就是溢出。256相当于正向溢出1即余值为1最后的值等于0`0 + 1 -1`-1相当于负向溢出1余值也为1最后的值等于255`255 - 1 + 1`
上面代码中,`uint8`是一个8位视图而256的二进制形式是一个9位的值`100000000`这时就会发生溢出。根据规则只会保留后8位`00000000``uint8`视图的解释规则是无符号的8位整数所以`00000000`就是`0`
下面是8位带符号整数的例子。
负数在计算机内部采用“2的补码”表示也就是说将对应的正数值进行否运算然后加`1`。比如,`-1`对应的正值是`1`,进行否运算以后,得到`11111110`,再加上`1`就是补码形式`11111111``uint8`按照无符号的8位整数解释`11111111`,返回结果就是`255`
一个简单转换规则,可以这样表示。
- 正向溢出overflow当输入值大于当前数据类型的最大值结果等于当前数据类型的最小值加上余值再减去1。
- 负向溢出underflow当输入值小于当前数据类型的最小值结果等于当前数据类型的最大值减去余值再加上1。
请看下面的例子。
```javascript
var int8 = new Int8Array(1);
@ -492,9 +499,9 @@ int8[0] = -129;
int8[0] // 127
```
上面例子中,8位带符号整数的数值范围是-128到127。128相当于正向溢出1等于-128-129相当于负向溢出1等于127
上面例子中,`int8`是一个带符号的8位整数视图它的最大值是127最小值是-128。输入值为`128`时,相当于正向溢出`1`根据“最小值加上余值再减去1”的规则就会返回`-128`;输入值为`-129`时,相当于负向溢出`1`根据“最大值减去余值再加上1”的规则就会返回`127`
`Uint8ClampedArray`视图的溢出与上面的规则有所不同。负向溢出都等于0正向溢出都等于255
`Uint8ClampedArray`视图的溢出规则与上面的规则不同。它规定凡是发生正向溢出该值一律等于当前数据类型的最大值即255如果发生负向溢出该值一律等于当前数据类型的最小值即0
```javascript
var uint8c = new Uint8ClampedArray(1);
@ -506,7 +513,7 @@ uint8c[0] = -1;
uint8c[0] // 0
```
上面例子中,`Uint8C`类型的数值范围与8位无符号整数相同都是0到255。正向溢出都等于255负向溢出都等于0。
上面例子中,`uint8C`是一个`Uint8ClampedArray`视图正向溢出时都返回255负向溢出都返回0。
### TypedArray.prototype.buffer