質問: [Int8](repeating: 0, count: rawArray2.count*2) d.getBytes(&b, length: rawArray2.count*2) for i in b{ print(i) } ``` 結果がこのようになりました。 44 1 -112 1 -12 1 公式ドキュメント にて A static byte buffer that~ という説明だったので、8bitごとに区分けされているバッファだと理解しましたが誤りでしょうか。 Int16の配列をNSDataで扱おうとした時に、256進数で扱われ配列として考えたときに要素数は倍になります。、 例えば300であれば1バイト目が1、2バイト目が44になることを期待していました。 どうも結果からは2バイト目が2桁目に相当するように見受けられます。 まだ、ここまでは想定と逆程度の話なので、仕様ということで片付けられるのですが、 2つ目の要素である400については1桁目は144、二桁目は1となる想定ですが、結果を見ると-112となっています。144-256=-112なので、恐らくそういうことなのだろうと思いましたが、どうしてこのようになるのでしょうか。 そもそもこういう想定自体誤りなのかもしれません。
回答: NSDataの話というより、符号付整数のビット表現の話ですね。 通常は符号付整数の負の数は「2の補数」というものを用いて表されています。 最上位ビットが1の時は負の数とします。 400を16bitであらわすと 0000 0001 1001 0000 です これを8bitづつに分けた場合 0000 0001 = 1 1001 0000 = ? となります。 下位8bitを解析します まず、最上位ビットが1ですのでこれは負の数です 2の補数をとると 0111 0000 = 112 ですので下位8bitビットは -112 になります。