我想要变得懒惰并编写一些代码,如果目标机器的字节顺序与我自己的字节序不同,那么它将会破坏。但我想知道什么时候它会中断,所以如果有必要,我可以解决它。
浮点数和整数的字节顺序是编译程序的属性,这样我可以在编译时通过某种断言检查它吗?或者它是我必须在运行时声明的东西?
答案 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>