ByteArray (3)
2008/07/28 21:16 - AS3.0
ByteArray のメソッド、今回は数値の write、read について。
以下の一覧のとおり、数値の write、read は必ずしも1対1対応ではありません。
容量 | 書込メソッド | 読込メソッド | 表現範囲 |
---|---|---|---|
1バイト | writeByte | readByte | -128~127 |
readUnsignedByte | 0~255 | ||
2バイト | writeShort | readShort | -32,768~32,767 |
readUnsignedShort | 0~65,535 | ||
4バイト | writeInt | readInt | -2,147,483,648~2,147,483,647 |
writeUnsignedInt | readUnsignedInt | 0~4,294,967,296 | |
writeFloat | readFloat | 32ビット浮動小数点数 | |
8バイト | writeDouble | readDouble | 64ビット浮動小数点数 |
容量が1バイト、もしくは2バイトの数値に関わるメソッドは write が一つなのに対し、read は 返り値が int 型と uint 型の二通りあります。
なぜに write は一つなのに read が二つあるのか。 それは数値クラスの設計が関わってきているんだと思います。
LiveDocs の int 型、uint 型のページにはそれぞれ以下のように書いてあります。
int クラスを使用すると、32 ビットの符号付き整数を表すデータ型を操作できます。
int クラスで表される値の範囲は、-2,147,483,648 (-2^31) ~ 2,147,483,647 (2^31-1) です。
uint クラスには、32 ビットの符号なし整数を表すデータ型を操作するメソッドがあります。
符号なし整数は正のみであるため、最大値は int クラスの値の 2 倍になります。
uint クラスで表される値の範囲は、0 ~ 4,294,967,295 (2^32-1) です。
int 型も uint 型もともに32ビット(4バイト)の整数を扱うことができると書いてあります。
一方、1バイトおよび2バイトのデータの書込にかかるメソッド writeByte と writeShort について、liveDocs ではそれぞれ引数となる32ビット整数の下位当該バイトを書き込むとなっています。
バイトストリームにバイトを書き込みます。
パラメータの下位 8 ビットが使用されます。上位 24 ビットは無視されます。
writeShort()
バイトストリームに 16 ビット整数を書き込みます。
パラメータの下位 16 ビットが使用されます。上位 16 ビットは無視されます。
ByteArray クラス
コンピュータの内部処理として、ある数値の正負は、その数値が格納されたメモリのビット列の最上位1ビットが0なのか1なのかで決まるんだとか(0が正、1が負)。
- 論理演算についての「シフト演算を使ってみよう」のおまけ より
( from Flashゲーム講座&ASサンプル集)
つまり writeByte(1バイト)および writeShort(2バイト)を使うと、その正負を判定するビットが削除されてしまい、正数だか負数だか分からなくなるってことなんですよね。
しかし ByteArray の存在意義はメモリの節約なんだから、扱う数値の桁が充分に小さい場合、1データの容量として4バイトも費やすのは如何なものか、1バイトや2バイトでもよろしかろう、と。
でも4バイト未満では数値型の設計上、正負の判定ができないよ、判定は使用者責任でやってね、と。
それゆえ xxxxByte()、xxxxShort() を使用する際は、正数のみ使用するのか(readUnsignedByte、readUnsignedShort)、正負両方使用するのか(readByte、readShort)を、ユーザ側が意識的にメソッドを使い分けないとダメだ、ということなんじゃないか、と私は理解しました。
続く。