C语言_大小端与union

大端(big_endian):字数据的高字节存储在低地址中,而字数据的低字节存储在高地址中。

小端(little_endian):字数据的高字节存存储在高地址中,而字数据的低字节存储在低字节中。


而对union型成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始的。

利用这个特性,我们可以判断当前系统是大端还是小端。


#include <stdio.h>

union AA
{
        int i;
        char a[2];
};

int is_little_endian()
{
        union check
        {
                int i;
                char ch;
        }c;
        c.i = 1;

        return (c.ch == 1);
}

int main()
{
        int ret;
        union AA *p, u;
        p = &u;

        memset(&u, 0, sizeof(union AA));
        p->a[0] = 0x39;
        p->a[1] = 0x38;

        printf("0x%x\n", p->i);

        if(is_little_endian()){
                printf("little endian!\n");
        }
        else{
                printf("big endian!\n");
        }

        return 0;
}


test@test:~/tmp/cbase$ gcc union.c 
test@test:~/tmp/cbase$ ./a.out 
0x3839
little endian!



你可能感兴趣的:(c,gcc,存储,语言)