31515


**TypedArrayについて調べているのですが、**

例えば、[Int8Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Int8Array)
と
[Int16Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Int16Array)
で同じような処理をしていますが、これはどういう風に使い分けるのでしょうか？

**要素数2の配列を作成して、0番目に42を格納して取り出す**  
・Int8Array

[code]

    var uint8 = new Int8Array(2);
    int8[0] = 42;
    
[/code]

・Int16Array

[code]

    var int16 = new Int16Array(2);
    int16[0] = 42;
    
[/code]

* * *

**要素一個あたりのバイト数を返す「BYTES_PER_ELEMENT」プロパティは異なりますが、この結果は何に影響するでしょうか？**  
・容量を節約したいってことですか？

・ 「8 ビット符号付き整数値」「16
ビット符号付き整数値」の違いがよく分からないのですが、数値を扱う際、予めビット計算(か何か)して格納する容量を求めないといけない、ということでしょうか？？


CC BY-SA 3.0
2016-12-29T03:11:20.910
31511
2016-12-29T03:54:30.497
7886
question
javascript
「Int8Array」と「Int16Array」の違い。使い分け方は？


簡単に言うと`Int8Array`と`Int16Array`の違いは、

  * `Int8Array`の各要素が保持できる値の範囲は`-128`...`127`
  * `Int16Array`の各要素が保持できる値の範囲は`-32768`...`32767`

と言うことですね。

[code]

    var int8 = new Int8Array(2);
    int8[0] = 300;
    alert(int8[0]); //->44 (8ビットで表現できない部分が切り捨てられている)
    
    var int16 = new Int16Array(2);
    int16[0] = 300;
    alert(int16[0]); //->300
    
[/code]

**_・容量を節約したいってことですか？_**

それも目的の一つです。数百万の数値を扱う時にひとつの数値が1バイト(=8ビット)で表現できるのに2バイト(=16ビット)使うのはメモリの無駄ですし、参照するデータ量がその規模になるとメモリの使用量は実行速度にも影響してきます。

※データ量が少ない場合は、64ビット整数型の方が8ビット整数型より速い場合もよくあります。

**_・ 「8 ビット符号付き整数値」「16
ビット符号付き整数値」の違いがよく分からないのですが、数値を扱う際、予めビット計算(か何か)して格納する容量を求めないといけない、ということでしょうか？？_**

最初から2進数(ビット)で考えると分かりにくいかもしれませんので、10進数でのたとえ話を。

ある言語では「4桁整数」と「8桁整数」と言う2つの整数型があった場合、年号(もちろんとんでもない超未来は想定外)にはどちらのデータ型を使うでしょうか?

メモリの使用量は気にしない場合、他が全て「8桁整数」なんでそれに合わせとく、なんて考え方もありですが、そうではなくメモリの使用量を気にするなら「4桁整数」の方を選ばれるのではないでしょうか。

2進数で考える場合でも同じことで、想定される値の範囲が8ビットに収まるなら8ビットのデータ型を16ビット必要なら16ビット使うと言うだけです。値の範囲がなぜ上記のようになるかは機会と意欲があれば勉強してみてください。「ビット計算」なんて表現で想像される難しいことは普通やりません。

と言うことで、最初の質問に戻ると。

**_これはどういう風に使い分けるのでしょうか？_**

TypedArrayと言うのはWebGLのように大量のデータを高効率で扱わないといけないような機能がJavaScript/Webの世界に導入された時に一緒に導入されたものです。

平均的なJavaScriptプログラマーなら、自分の使いたい機能に`Int8Array`が必要なら`Int8Array`を、`Int16Array`が必要なら`Int16Array`を使う、と言うことになるでしょう。

WebGLとまではいかないが大量のデータを少しでも効率よく扱うコードを書きたい、と言うのであれば、自分の取り扱いたいデータがどの範囲に収まるのか(自分で計算しなくてもあちこちに書いてあるので2進数について学習しなくても使い分けられます)で選ぶことになるかと思います。


CC BY-SA 3.0
2016-12-29T03:54:30.497
31515
2016-12-29T03:54:30.497
13972
31511
answer