首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时检查MAC上C程序的CPU类型

在运行时检查MAC上C程序的CPU类型
EN

Stack Overflow用户
提问于 2009-12-03 01:09:05
回答 3查看 1K关注 0票数 3

C程序如何在运行时(而不是编译时)确定它是在Little-Endian还是Big-Endian CPU上运行?

它必须是“运行时”检查的原因,而不是“编译时”,是因为我正在构建的程序在MAC OSX的通用二进制格式,使用我的MAC与英特尔-CPU。这个程序预计可以在Intel和Power-PC的CPU上运行。也就是说,通过MAC上的通用二进制格式,我想用Intel-CPU构建一个程序,并在PPC CPU下运行它。

我的程序中需要CPU检查的逻辑是64位整数的主机到网络字节顺序更改函数。现在我让它盲目地交换字节顺序,这在Intel-CPU上工作得很好,但在PPC上会中断。下面是C函数:

代码语言:javascript
复制
unsigned long long
hton64b (const unsigned long long h64bits) {
   // Low-order 32 bits in front, followed by high-order 32 bits.
   return (
       (
        (unsigned long long)
        ( htonl((unsigned long) (h64bits & 0xFFFFFFFF)) )
       ) << 32
      )
      |
      (
       htonl((unsigned long) (((h64bits) >> 32) & 0xFFFFFFFF))
      );
}; // hton64b()

有没有更好的跨平台方式呢?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2009-12-03 01:29:53

不要费心检查;只要需要一个网络无关值,就使用hton*。有了一个好的设计,这应该仅限于在你的程序和任何需要网络无关的整数之间进行接口的模块。

在已经有网络顺序的大端系统上,hton*可能只是一个宏,所以它是免费的。在小端系统上,无论如何你都需要这样做,所以检查你是否需要这样做只会减慢你的速度。

如果这还不够,那么您需要更好地解释您试图完成的任务,以及为什么您需要在运行时了解系统的字节顺序。

票数 2
EN

Stack Overflow用户

发布于 2009-12-03 01:19:52

您是否意识到mac上的通用二进制文件需要多次编译,每种架构编译一次?我想,当您谈到编译时,您指的是使用您的configure/make系统来通知源代码...只需使用gcc常量(如LITTLE_ENDIAN )

票数 0
EN

Stack Overflow用户

发布于 2009-12-03 18:30:42

您不需要在运行时检查字节顺序。将应用程序编译为通用二进制文件时,会使用适当的定义与宏对其进行多次编译,即使您是在英特尔计算机上编译也是如此。在运行时,mach-o加载程序将选择从通用二进制文件(即PowerPC上的ppc或英特尔上的i386 )运行的最佳体系结构。

通用二进制文件并不意味着一个二进制文件可用于多个体系结构。这意味着一个fat二进制文件包含一个用于一个体系结构的二进制文件。

请参考http://developer.apple.com/legacy/mac/library/documentation/MacOSX/Conceptual/universal_binary/universal_binary_intro/universal_binary_intro.html了解更多详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1834373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档