0

NSSwap を使用して 32 ビット符号なし整数のバイトをスワップしようとしています

私の元の NSInteger は13a81fbeで、次のようになりたい: be1fa813

走った後

NSInteger swappedInteger = NSSwapInt(unencodedInteger);

バイト値がbe1fa813の新しい整数を取得します。しかし、これをコンソールに出力しようとすると、-1105221613 が表示されます

私の完全なコードはこれです:

//get bytes within range
NSInteger unencodedInteger;
[mydata getBytes:&unencodedInteger range:myRange];

//swap the endianess of the bytes
NSInteger swappedInteger = NSSwapInt(unencodedInteger);

//debug logging
NSLog(@"Original: %x (%d)   Swapped: %x (%d)",unencodedInteger, unencodedInteger,swappedInteger, swappedInteger);

//add swapped integer to array
[banks addObject:[NSNumber numberWithInteger:swappedInteger]];

新しいスワップされた値が署名されているかのように機能する理由を誰かが理解していますか?

4

2 に答える 2

2

バイナリで:

0xbe1fa813 = 0b10111110000111111010100000010011

おそらく、あなたが使用しているアーキテクチャ (iOS) は、符号付き整数を 2 の補数で表されているかのように扱います。つまり、値が負の場合、最上位ビットが設定されます。したがって、符号付き整数として解釈されるこの数値は、1ビットで始まるため、負になります。OS X で簡単なテスト プログラムを作成したところ、printf()指定した変換指定子に応じて、適切な負の整数と正の整数が実際に出力されます。

#include <stdio.h>

int main(void)
{
    printf("%x %u %d\n", 0xbe1fa813, (unsigned)0xbe1fa813, 0xbe1fa813);
    return 0;
}

出力:

be1fa813 3189745683 -1105221613

これはすべて間違いなく期待されていると言えます。

于 2012-12-30T23:11:48.720 に答える
0

%dinprintfは整数を符号付きとして解釈します。%u署名なしとして解釈したい場合に使用します。

于 2012-12-30T23:16:50.283 に答える