【技巧】用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;
}
经验分享 程序员 微信小程序 职场和发展