我希望能够写一些代码,如果目标机器的字节序与我的不同,它就会出错。但是当然,我想知道什么时候会出错,这样我就可以在必要时修复它。
浮点数和整数的字节序是编译程序的属性吗?我是否可以通过某种断言在编译时检查它?还是说这是我必须在运行时断言的东西?
我希望能够写一些代码,如果目标机器的字节序与我的不同,它就会出错。但是当然,我想知道什么时候会出错,这样我就可以在必要时修复它。
浮点数和整数的字节序是编译程序的属性吗?我是否可以通过某种断言在编译时检查它?还是说这是我必须在运行时断言的东西?
是的,字节序是特定机器固有的,在编译时就已知。大多数操作系统都会在某个地方设置一个#define
来告诉你字节序。
特别地,对于Linux,您可以执行以下操作:
#if __BYTE_ORDER == __LITTLE_ENDIAN
...
#elif __BYTE_ORDER == __BIG_ENDIAN
...
#elif __BYTE_ORDER == __PDP_ENDIAN
...
#else
...
#endif
#define
,编译器才会这样做。可以改进并讨论整数和浮点数的字节序差异。 - chux - Reinstate Monica一些硬件提供两种模式(例如PowerPC)......但通常有本地模式。无论如何,编译时断言通常就足够了。
浮点数和整数的字节序是编译程序的属性吗?我可以通过某种断言在编译时检查它吗?
在编译时决定生成哪些机器代码。程序不能被编译成适用于完全不同 CPU 架构的机器代码。
要在运行时检查当前硬件使用的字节序,有几种方法可用。
还请参见 在编译时确定字节序。
不要在代码中使用断言来假定特定的字节序,而应该使用技术使任何保存到文件或通过网络连接通信的数据都透明地处理字节序。
一种方法是仅指定使用大端数据,代码使用hton<x>()
, ntoh<x>()
函数族对数据进行编码和解码(另请参见网络字节顺序)。
int
创建“保存文件”,而没有像建议的hton<x>()
那样的字节序保护机制,那么在另一个平台上加载这样的“保存”将是不可能的。所有数据的导入/导出都使用hton<x>()
/等来确保从应用程序进出的数据具有固定的字节序。 - Ped7g