字节顺序是在编译时决定的吗?
Is endianness decided at compile time?
我现在想偷懒,写一些代码,如果目标机器的字节顺序与我自己的不同,这些代码就会中断。但我当然想知道它什么时候坏了,所以我可以在必要时修复它。
浮点数和整数的字节顺序是否是已编译程序的 属性,这样我就可以在编译时通过断言以某种方式检查它?还是我必须在运行时断言?
Is the endianness of floats and integers a property of the compiled program, such that I can check it at compile time with an assertion somehow?
生成哪种机器码是在编译时决定的。程序无法编译为机器代码,它适用于完全不同的 CPU 架构。
要在运行时检查当前硬件使用的字节顺序,有几种方法可用。
另见 Determining endianness at compile time。
您不应使用断言来假设代码中的特定字节顺序,而应使用技术使任何数据保存到文件或通过网络连接进行通信时对字节顺序透明。
一种方法是指定仅应使用大端数据,代码使用 hton<x>()
, ntoh<x>()
family of functions to encode and decode the data (see also network byte order).
是的,字节序是相关机器固有的,并且在编译时已知。大多数操作系统都会在某处设置 #define
来告诉您字节序是什么。
在 Linux 上,您可以执行以下操作:
#if __BYTE_ORDER == __LITTLE_ENDIAN
...
#elif __BYTE_ORDER == __BIG_ENDIAN
...
#elif __BYTE_ORDER == __PDP_ENDIAN
...
#else
...
#endif
有些硬件同时提供这两种模式(例如 PowerPC)...但通常有一种本机模式。无论如何,编译时断言通常就足够了。
我现在想偷懒,写一些代码,如果目标机器的字节顺序与我自己的不同,这些代码就会中断。但我当然想知道它什么时候坏了,所以我可以在必要时修复它。
浮点数和整数的字节顺序是否是已编译程序的 属性,这样我就可以在编译时通过断言以某种方式检查它?还是我必须在运行时断言?
Is the endianness of floats and integers a property of the compiled program, such that I can check it at compile time with an assertion somehow?
生成哪种机器码是在编译时决定的。程序无法编译为机器代码,它适用于完全不同的 CPU 架构。
要在运行时检查当前硬件使用的字节顺序,有几种方法可用。
另见 Determining endianness at compile time。
您不应使用断言来假设代码中的特定字节顺序,而应使用技术使任何数据保存到文件或通过网络连接进行通信时对字节顺序透明。
一种方法是指定仅应使用大端数据,代码使用 hton<x>()
, ntoh<x>()
family of functions to encode and decode the data (see also network byte order).
是的,字节序是相关机器固有的,并且在编译时已知。大多数操作系统都会在某处设置 #define
来告诉您字节序是什么。
在 Linux 上,您可以执行以下操作:
#if __BYTE_ORDER == __LITTLE_ENDIAN
...
#elif __BYTE_ORDER == __BIG_ENDIAN
...
#elif __BYTE_ORDER == __PDP_ENDIAN
...
#else
...
#endif
有些硬件同时提供这两种模式(例如 PowerPC)...但通常有一种本机模式。无论如何,编译时断言通常就足够了。