//=======================================
第一个方案
//---------------------------------------------------------
union
{
int a;
char b;
}EndianTest;
EndianTest.a = 0x00000001;
if( EndianTest.b == 0x01 )
//是小端
else
//是大端
这个方案能够理解,将EndianTest.a直接赋值为1
若是小端机器,那么存储在内存中的数据就是0x01000000
若是大端机器,那么存储在内存中的数据就是0x00000001
这样只要取该数据在内存中低位1个字节,就能够判断出本机是小端还是大端。
//======================================
第二个方案(网上说是linux中的实现)
第一个方案
//---------------------------------------------------------
union
{
int a;
char b;
}EndianTest;
EndianTest.a = 0x00000001;
if( EndianTest.b == 0x01 )
//是小端
else
//是大端
这个方案能够理解,将EndianTest.a直接赋值为1
若是小端机器,那么存储在内存中的数据就是0x01000000
若是大端机器,那么存储在内存中的数据就是0x00000001
这样只要取该数据在内存中低位1个字节,就能够判断出本机是小端还是大端。
//======================================
第二个方案(网上说是linux中的实现)
//----------------------------------------------------------
static union
{
char c[4];
unsigned long l;
}endian_test = { { 'l','?','?','b' } };
#define ENDIANNESS ((char)endian_test.l)
endian_test 初始化的时候是按照char数组初始化的。
所以在内存中endian_test的布局是
高地址
^ b
| ?
| ?
| l
低地址
但是你取endian_test.l的时候,是按照long占的四个字节来取数据的
也就是如果是小端机器 取出来的是b??l
大端机器取出来的是l??b
然后再转换成char, 则去掉3个字节的高位
也就是小段是l 大端是b
完整的程序应该是:
static union
{
char c[4];
unsigned long l;
}endian_test = { { 'l','?','?','b' } };
#define ENDIANNESS ((char)endian_test.l)
if (ENDIANNESS == 'b')
{
printf("big\n");
}
else if(ENDIANNESS == 'l')
{
printf("little\n");
}
else
{
printf("error\n");
}