Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSSwap是否返回有符号整数?_Objective C_Ios_Endianness - Fatal编程技术网

Objective c NSSwap是否返回有符号整数?

Objective c NSSwap是否返回有符号整数?,objective-c,ios,endianness,Objective C,Ios,Endianness,我正在尝试使用NSSwap交换32位无符号整数的字节 我最初的NSInteger是13a81fbe,我希望它变成:be1fa813 跑步后 NSInteger swappedInteger = NSSwapInt(unencodedInteger); 我得到一个新的整数,其字节值为:be1fa813。但是当我把它打印到控制台时,我得到了-1105221613 我的完整代码如下: //get bytes within range NSInteger unencodedInteger; [myda

我正在尝试使用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]];
有人知道为什么新交换的值会像有符号一样工作吗?

二进制:

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;
}

我想说这一切都是意料之中的。
printf
中的
%d
将整数解释为带符号的。如果您想将其解释为未签名,请使用
%u

您是对的。通过使用%u而不是%d打印NSInteger,我确实看到我的整数被交换了correctly@shred444是的,差不多就是这样。但是,不要忘记强制转换为(unsigned),如果将有符号的值提供给无符号转换说明符,则会导致未定义的行为,这也是我在代码中强制转换它的原因。
be1fa813 3189745683 -1105221613