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:
parent
d2fca7f2a1
commit
96c3de7eaa
@ -464,9 +464,9 @@ function str2ab(str) {
|
|||||||
|
|
||||||
### 溢出
|
### 溢出
|
||||||
|
|
||||||
不同的视图类型,所能容纳的数值范围是确定的。超出这个范围,就会出现溢出。
|
不同的视图类型,所能容纳的数值范围是确定的。超出这个范围,就会出现溢出。比如,8位视图只能容纳一个8位的二进制值,如果放入一个9位的值,就会溢出。
|
||||||
|
|
||||||
TypedArray数组对于溢出,采用的处理方法是求余值。正向溢出(overflow)的含义是输入值大于当前数据类型的最大值,最后得到的值就等于当前数据类型的最小值加上余值,再减去1;负向溢出(underflow)等于当前数据类型的最大值减去余值,再加上1。
|
TypedArray数组的溢出处理规则,简单来说,就是抛弃溢出的位,然后按照视图类型进行解释。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var uint8 = new Uint8Array(1);
|
var uint8 = new Uint8Array(1);
|
||||||
@ -478,9 +478,16 @@ uint8[0] = -1;
|
|||||||
uint8[0] // 255
|
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
|
```javascript
|
||||||
var int8 = new Int8Array(1);
|
var int8 = new Int8Array(1);
|
||||||
@ -492,9 +499,9 @@ int8[0] = -129;
|
|||||||
int8[0] // 127
|
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
|
```javascript
|
||||||
var uint8c = new Uint8ClampedArray(1);
|
var uint8c = new Uint8ClampedArray(1);
|
||||||
@ -506,7 +513,7 @@ uint8c[0] = -1;
|
|||||||
uint8c[0] // 0
|
uint8c[0] // 0
|
||||||
```
|
```
|
||||||
|
|
||||||
上面例子中,`Uint8C`类型的数值范围与8位无符号整数相同,都是0到255。正向溢出都等于255,负向溢出都等于0。
|
上面例子中,`uint8C`是一个`Uint8ClampedArray`视图,正向溢出时都返回255,负向溢出都返回0。
|
||||||
|
|
||||||
### TypedArray.prototype.buffer
|
### TypedArray.prototype.buffer
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user