49602


■環境  
Mac/High Sierra 10.13.6/swift4.2/xcode 10.0

下記のようなコードで

[code]

    var rawArray2:[Int16] = [300,400,500]
    let d = NSData(bytes: &rawArray2, length: rawArray2.count*2)
    var b = [Int8](repeating: 0, count: rawArray2.count*2)
    d.getBytes(&b, length: rawArray2.count*2)
    for i in b{
        print(i)
    }
    
[/code]

結果がこのようになりました。  
44  
1  
-112  
1  
-12  
1  
公式ドキュメント  
<https://developer.apple.com/documentation/foundation/nsdata>  
にて  
A static byte buffer that~  
という説明だったので、8bitごとに区分けされているバッファだと理解しましたが誤りでしょうか。  
Int16の配列をNSDataで扱おうとした時に、256進数で扱われ配列として考えたときに要素数は倍になります。、  
例えば300であれば1バイト目が1、2バイト目が44になることを期待していました。  
どうも結果からは2バイト目が２桁目に相当するように見受けられます。  
まだ、ここまでは想定と逆程度の話なので、仕様ということで片付けられるのですが、  
２つ目の要素である400については１桁目は144、二桁目は1となる想定ですが、結果を見ると-112となっています。144-256=-112なので、恐らくそういうことなのだろうと思いましたが、どうしてこのようになるのでしょうか。

そもそもこういう想定自体誤りなのかもしれません。


CC BY-SA 4.0
2018-10-24T04:30:53.337
49598
2018-10-24T06:06:55.283
2018-10-24T04:41:28.617
25745
25745
question
swift xcode swift4
NSDataの挙動がわからない


NSDataの話というより、符号付整数のビット表現の話ですね。  
通常は符号付整数の負の数は「2の補数」というものを用いて表されています。  
最上位ビットが1の時は負の数とします。

400を16bitであらわすと  
0000 0001 1001 0000  
です  
これを8bitづつに分けた場合  
0000 0001 = 1  
1001 0000 = ？  
となります。

下位8bitを解析します  
まず、最上位ビットが1ですのでこれは負の数です  
2の補数をとると  
0111 0000 = 112  
ですので下位8bitビットは -112 になります。


CC BY-SA 4.0
2018-10-24T06:06:55.283
49602
2018-10-24T06:06:55.283
2741
49598
answer