objective-c - NSSwap 返回有符号整数?

标签 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]];

有谁知道为什么新的交换值就像已签名一样?

最佳答案

二进制:

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

我想说这一切都绝对是意料之中的。

关于objective-c - NSSwap 返回有符号整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14095575/

相关文章:

iphone - Xcode重复符号错误

ios - 关系数据库设计(电子商务)- 核心数据

c++ - 调用 socket::connect、socket::bind、socket::listen 之前不使用 getaddrinfo( ) 函数

转换指针地址偏移量不同

objective-c - 来自大纲 View 的 EXC_BAD_ACCESS :child:ofItem

ios - 如何在 Xcode 8.2.1 中添加 provison 配置文件证书

iphone - 如果应用程序已安装,则在 UIWebView 中打开指向应用程序的 iTunes 链接

c++ - 原始数据包创建导致 IP 字段顺序不正确

iphone - 在 iPhone/iPad 上正确使用宏 #define

ios - 如何在 iPhone 中播放 H264 mpegts