NSSwap返回有符号整数?

时间:2012-12-30 22:59:12

标签: objective-c ios endianness

我正在尝试使用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]];

有没有人理解为什么新的交换价值表现得像是签名了?

2 个答案:

答案 0 :(得分: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

我说这一切都是绝对预期的。

答案 1 :(得分:0)

%d中的

printf会将整数解释为已签名。如果您想将其解释为无符号,请使用%u