c 实现测试CPU是大端还是小端

union
{
unsigned long bits32;
unsigned char bytes[4];
} unValue;

unValue.bytes[0] = 0;
unValue.bytes[1] = 1;
unValue.bytes[2] = 0;
unValue.bytes[3] = 0;

isLittleEndian = ( unValue.bits32 == 256 );

//

union虽然也可以像struct那样声明多个域
但是与struct不同的是
struct各域的内存空间是独立的
而union各域的内存首地址是相同的
也就是union里的各域共享彼此的内存
因此你改了其中一个域的话也会同时更改其他域的值
具体到这个例子我申明了个union
它有两个域unsigned long bits32和unsigned char bytes[4]
它们都是32位且共用同一段内存
如下图
| bytes[0] | bytes[1] | bytes[2] | bytes[3] |
00000000 00000000 00000000 00000000
|<---------------bits32-------------------->|
当unValue.bytes[0] = 0;
unValue.bytes[1] = 1;
unValue.bytes[2] = 0;
unValue.bytes[3] = 0;
赋值过后这段内存变为
| bytes[0] | bytes[1] | bytes[2] | bytes[3] |
00000000 00000001 00000000 00000000
|<---------------bits32-------------------->|
在小端机器上这段内存作为unsigned int的话值为256,而在大端机器上作为unsigned int的话其值是65536
因此用bits32与256进行比较
如果为真说明是小端机器
如果为假说明是大端机器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值