我使用条件((char)((int)511) == (char)255) 测试字节序。真为小,假为大。
我已经在几个单独的系统上测试了这个,无论大小,使用 gcc 并关闭优化。在我所做的每一项测试中,我都得到了正确的结果。
您可以在应用程序需要执行字节序关键操作之前将该条件放在应用程序的 if 中。如果您只想保证您在整个应用程序中使用正确的字节序,您可以改用静态断言方法,如下所示:
extern char ASSERTION__LITTLE_ENDIAN[((char)((int)511) == (char)255)?1:-1];
如果系统不是 little endian,全局范围内的那一行将产生编译错误,并拒绝编译。如果没有错误,它将完美编译,就好像该行不存在一样。我发现错误消息非常具有描述性:
error: size of array 'ASSERTION__LITTLE_ENDIAN' is negative
现在,如果您像我一样对编译器优化实际检查感到偏执,您可以执行以下操作:
int endian;
{
int i = 255;
char * c = &i;
endian = (c[0] == (char)255);
}
if(endian) // if endian is little
很好地压缩到这个宏中:
#define isLittleEndian(e) int e; { int i = 255; char * c = &i; e = (c[0] == (char)255); }
isLittleEndian(endian);
if(endian) // if endian is little
或者如果你使用 GCC,你可以逃脱:
#define isLittleEndian ({int i = 255; char * c = &i; (c[0] == (char)255);})
if(isLittleEndian) // if endian is little