【技巧】用union验证机器为大端还是小端
union U{ short a; char c; }; U u;
在C Programming Language 一书中对于联合体是这么描述的:
1)联合体是一个结构;
2)它的所有成员相对于基地址的偏移量都为0;
3)此结构空间要大到足够容纳最"宽"的成员;
4)其对齐方式要适合其中所有的成员;
所以一个联合体在内存中的存储形式如下图:
从图中,很容易看出变量a、c、u的地址都是0x20000000
u.a=0x1234;
小端模式(数据的高字节保存在内存的高地址中)下,存储情况如下:
大端模式下(数据的高字节保存在内存的低地址中),存储情况如下:
所以,只要我们取出变量c的值,进行比对;若其值为34h,则机器为小端模式,若其值为12h,则机器为大端模式。
实现代码如下:
#include <stdio.h> union U{ int a; char c; }u; int main() { u.a=0x1234; if(0x34 == u.c) { printf("The machine is little-end. "); } else if(0x12 == u.c) { printf("The machine is big-end. "); } return 0; }