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 回答