整理一些用于判断机器字节序(Byte Order)的程序,通过预定义宏或者数据在内存中的布局进行判断。
BYTE_ORDER
宏定义BYTE_ORDER
表示当前机器的字节序,BYTE_ORDER
的值被定义为LITTLE_ENDIAN
,BIG_ENDIAN
或者PDP_ENDIAN
的其中之一。
其中宏定义LITTLE_ENDIAN
表示Little-Endian小端,宏定义BIG_ENDIAN
表示Big-Endian大端,宏定义PDP_ENDIAN
表示PDP-Endian。
使用BYTE_ORDER
需要包含头文件#include
。
使用BYTE_ORDER
判断机器字节序的测试程序:
void check(void)
{
if(BYTE_ORDER == LITTLE_ENDIAN)
printf("Little-Endian\n");
else if(BYTE_ORDER == BIG_ENDIAN)
printf("Big-Endian\n");
else
printf("PDP-Endian\n");
}
或者
void check(void)
{
#if BYTE_ORDER == LITTLE_ENDIAN
printf("Little-Endian\n");
#elif BYTE_ORDER == BIG_ENDIAN
printf("Big-Endian\n");
#else
printf("PDP-Endian\n");
#endif
}
__BYTE_ORDER
宏定义__BYTE_ORDER
与BYTE_ORDER
含义相同,表示当前机器的字节序,__BYTE_ORDER
的值被定义为__LITTLE_ENDIAN
,__BIG_ENDIAN
或者__PDP_ENDIAN
的其中之一。
其中宏定义__LITTLE_ENDIAN
表示Little-Endian小端,宏定义__BIG_ENDIAN
表示Big-Endian大端,宏定义__PDP_ENDIAN
表示PDP-Endian。
使用__BYTE_ORDER
需要包含头文件#include
。
使用__BYTE_ORDER
判断机器字节序的测试程序:
void check(void)
{
if(__BYTE_ORDER == __LITTLE_ENDIAN)
printf("Little-Endian\n");
else if(__BYTE_ORDER == __BIG_ENDIAN)
printf("Big-Endian\n");
else
printf("PDP-Endian\n");
}
或者
void check(void)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
printf("Little-Endian\n");
#elif __BYTE_ORDER == __BIG_ENDIAN
printf("Big-Endian\n");
#else
printf("PDP-Endian\n");
#endif
}
__BYTE_ORDER__
__BYTE_ORDER__
是GNU C 扩展的预定义宏。
__BYTE_ORDER__
被定义为 __ORDER_LITTLE_ENDIAN__
、__ORDER_BIG_ENDIAN__
或 __ORDER_PDP_ENDIAN__
值之一。
使用__BYTE_ORDER__
来判断字节序的测试程序:
void check(void)
{
if(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
printf("Little-Endian\n");
else if(__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
printf("Big-Endian\n");
else
printf("PDP-Endian\n");
}
可以根据数据在内存中的布局来判断。
定义一个32位整形数,进行赋值,然后根据每个字节的位置来判断当前机器的字节序。
可以通过判断低地址的值。
void check(void)
{
int32_t val = 0x44332211;
int8_t *ptr = (int8_t *)&val;
if(ptr[0] == 0x11)
printf("Little-Endian\n");
else if(ptr[0] == 0x44)
printf("Big-Endian\n");
else
printf("PDP-Endian\n");
}
也可以改成判断高地址的值。
void check(void)
{
int32_t val = 0x44332211;
int8_t *ptr = (int8_t *)&val;
if(ptr[3] == 0x44)
printf("Little-Endian\n");
else if(ptr[3] == 0x11)
printf("Big-Endian\n");
else
printf("PDP-Endian\n");
}
改成用union
类型来判断。
通过判断低地址的值,测试程序如下:
void check(void)
{
union
{
int32_t num;
int8_t buf[4];
} val;
val.num = 0x44332211;
if(val.buf[0] == 0x11)
printf("Little-Endian\n");
else if(val.buf[0] == 0x44)
printf("Big-Endian\n");
else
printf("PDP-Endian\n");
}
也可以改成判断高地址的值。
void check(void)
{
union
{
int32_t num;
int8_t buf[4];
} val;
val.num = 0x44332211;
if(val.buf[3] == 0x44)
printf("Little-Endian\n");
else if(val.buf[3] == 0x11)
printf("Big-Endian\n");
else
printf("PDP-Endian\n");
}
通过判断低地址的值来判断字节序,也可以修改union
的成员,将程序修改为:
void check(void)
{
union
{
int32_t num;
int8_t x;
} val;
val.num = 0x44332211;
if(val.x == 0x11)
printf("Little-Endian\n");
else if(val.x == 0x44)
printf("Big-Endian\n");
else
printf("PDP-Endian\n");
}
3.7.2 Common Predefined Macros
本文链接:https://blog.csdn.net/u012028275/article/details/126112405