字节序是在编译时决定的吗?

时间:2016-07-07 15:49:36

标签: c++ c endianness

我想要变得懒惰并编写一些代码,如果目标机器的字节顺序与我自己的字节序不同,那么它将会破坏。但我想知道什么时候它会中断,所以如果有必要,我可以解决它。

浮点数和整数的字节顺序是编译程序的属性,这样我可以在编译时通过某种断言检查它吗?或者它是我必须在运行时声明的东西?

3 个答案:

答案 0 :(得分:5)

是的,字节序是有问题的机器所固有的,并且在编译时是已知的。大多数操作系统都会在某处设置#define,以告诉您字节顺序是什么。

特别是在Linux上,您可以执行以下操作:

#if __BYTE_ORDER == __LITTLE_ENDIAN
...
#elif __BYTE_ORDER == __BIG_ENDIAN
...
#elif __BYTE_ORDER == __PDP_ENDIAN
...
#else
...
#endif

答案 1 :(得分:2)

某些硬件提供两者(例如PowerPC)......但通常有一种纯模式。无论如何,编译时断言通常就足够了。

答案 2 :(得分:1)

  

浮点数和整数的字节顺序是编译程序的属性,这样我就可以在编译时用断言以某种方式检查它吗?

在编译时决定生成哪个机器代码。程序无法编译为机器代码,它适用于完全不同的CPU架构。

要在运行时检查当前硬件使用哪种字节顺序,可以使用多种方法。

另见Determining endianness at compile time

您应使用技术将任何数据保存到文件中,或通过网络连接进行通信,而不是使用断言来假设代码中的特定字节顺序。

这样做的一种方法是仅指定应使用大端数据,并且代码使用hton<x>(), ntoh<x>()系列函数对数据进行编码和解码(另请参阅network byte order)。 / p>