我正在尝试使用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]];
有没有人理解为什么新的交换价值表现得像是签名了?
答案 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
。