typedef unsigned char BOOL;
#define BOOL_TRUE 1
#define BOOL_FALSE 0
判断机器大小端面,小端返回BOOL_TRUE,大端返回BOOL_FALSE;
首先,先说明下大小端的定义:
小端:内存的低地址存储的是数据的低位,高地址存储的是数据的高位。
大端:内存的高地址存储的是数据的
例:大小端对一个int类型数据的存储,以0x12345678为例
| 内存地址 | 0x0103 | 0x0102 | 0x0101 | 0x0100 |
| 小端 | 12 | 34 | 56 | 78 |
| 大端 | 78 | 56 | 34 | 12 |
1.利用联合体特性判断(联合体union的存放顺序是所有成员都从低地址开始存放)
BOOL IsLittleEndian()
{
ENDIAN_U stEndian;
stEndian.sShort = 0x0001;
if(stEndian.cChar == 0x01)
{
return BOOL_TRUE;
}
return BOOL_FALSE;
}
2.利用指针判断
BOOL IsLittleEndian()
{
short sShort = 0x1234;
char *pcChar = (char *)&sShort;
if(*pcChar == 0x34)
{
return BOOL_TRUE;
}
return BOOL_FALSE;
}
3.利用系统函数htons()判断
BOOL IsLittleEndian()
{
if(0x01 != htons(0x01))
{
return BOOL_TRUE;
}
return BOOL_FALSE;
}
常见的情况为以上三种,个人感觉还可以有一种
4.利用位域判断
typedef struct Endian_Bit_tag
{
char sReserve:4;
char sReserve2:4;
}ENDIAN_BIT_S;
BOOL IsLittleEndian_Bit()
{
ENDIAN_BIT_S stEndian;
*(char *)(&stEndian) = 0x01;
if(stEndian.sReserve== 0x1)
{
return BOOL_TRUE;
}
return BOOL_FALSE;
}
以此题为例:当机器为小端时,stEndian.sUseful的值是0x01,当机器为大端时,stEndian.sUseful的值是0x00

本文总结了四种判断机器大小端的方法:1) 利用联合体特性;2) 使用指针;3) 通过系统函数htons();4) 位域判断。通过实例解释了大小端存储方式,并指出在小端系统中,特定结构体变量的值为0x01,而在大端系统中则为0x00。
5012

被折叠的 条评论
为什么被折叠?



