From 96c3de7eaa6d642feb0917dcc033b430c9a15830 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 23 Mar 2016 14:29:20 +0800 Subject: [PATCH] =?UTF-8?q?docs(arrayBuffer):=20TypedArray=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=9A=84=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/arraybuffer.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/arraybuffer.md b/docs/arraybuffer.md index e33054f..a1b0e0b 100644 --- a/docs/arraybuffer.md +++ b/docs/arraybuffer.md @@ -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