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");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值