iPhone的字节序?


10

我知道iPhone(和iPad)运行在ARM处理器上,默认情况下它们是低端的(根据Wikipedia页面,iOS本身是低端的)。但是,ARM处理器据说可以在低端和大端之间切换。这怎么可能?它如何工作?


1
该问题的答案将如何帮助解决问题或改善您使用iPhone的体验?如果它解决了非开发人员最终用户的一些现实问题,那么技术性如何都没关系,但是如果问题仅对开发人员感兴趣,那么这里就不合时宜了。
丹尼尔

好的,那我应该将其移至stackoverflow吗?
slartibartfast 2012年

2
@myrkos或superuser.com
Dan J

6
让我们先弄清楚这个问题。我们正在寻找可引起长答案的简短问题。这适用于所有站点。一般来说,SuperUser并不是解决任何形式的iOS问题的地方。我们是iOS上出现硬件问题的最佳场所。如果您有一个特定的编程问题,那么问这个问题并解释iOS硬件字节序如何影响您的特定编程问题将是解决之道[SO而不是这里的论坛]。如果您希望用户对此问题有个看法,那么很难找到比这里更适合放置该问题的站点。
bmike

2
“ ARM是移动设备广泛使用的低端32位RISC架构。请在此处做个小说明:ARM是双端(如果需要的话,为字节性);您可以从最低级别切换字节序。它碰巧iOS使用了它的小端序,我似乎还记得实际上基带芯片(也是ARM内核,至少在最初的iPhone上-从未与其他iPhone打交道)实际上是大端序的。 IIRC不能像PowerPC(仿真器的强大功能)那样在每个进程级别上做到这一点。” news.ycombinator.com/item?id=1527676
0x6A75616E 2012年

Answers:


6

即使您认为您不需要知道某人可能会执行的字节序设置。无需解释为什么有人不需要它,因为您可能不知道上下文。问题不是“我是否需要了解字节序”,而是“是大字节序还是小字节序”。因此,请专注于该主题!

话虽如此,如果我们不重新发明轮子,而仅依靠Apple提供的宏,这可能是最佳实践。原因是因为他们花了很多时间来优化这些宏,并确保可以在模拟器上以及Mac,iPhone及其所有OS和硬件上正常运行。

如果您深入了解调用时发生的情况,则CFSwapInt16BigToHost可能会看到注释,表明这些宏可能会产生最佳的机器代码,您可以借助编译器优化来获得这些最佳代码:

OS_INLINE
uint16_t
_OSSwapInt16(
    uint16_t        data
)
{
  /* Reduces to 'rev16' with clang */
  return (uint16_t)(data << 8 | data >> 8);
}

OS_INLINE
uint32_t
_OSSwapInt32(
    uint32_t        data
)
{
#if defined(__llvm__)
  data = __builtin_bswap32(data);
#else
  /* This actually generates the best code */
  data = (((data ^ (data >> 16 | (data << 16))) & 0xFF00FFFF) >> 8) ^ (data >> 8 | data << 24);
#endif

  return data;
}

3

Endianness并不是最终用户可以真正与之交互的东西-但这是10,000英尺的摘要,对Apple产品的用户意味着什么。

简而言之,内部处理器的字节序与语言的书写方向相同。当您查看英文文本的字母时,我们都同意从左上方开始,先从右开始,然后向下阅读。其他语言从右边开始并读到左边,有些语言甚至在左移或右移之前首先阅读

对于用户而言,地址或数字内部表示中的位是否存储为小端或大端并不重要。实际上,Mac上的OS X遵循大尾数表示法,而iOS遵循小尾数排序。这个事实并不意味着这两个设备不能正常工作。之所以行之有效,是因为这种表示仅在内部发生,并且不会作为用户暴露给我们。


10
PowerPC上的OSX是Big Endian,在Intel上是Little Endian。
zaph 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.