【技巧】用union验证机器为大端还是小端

来源:互联网 发布:淘宝客服新手培训 编辑:程序博客网 时间:2024/05/02 22:10

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.\n");    }    else if(0x12 == u.c)    {        printf("The machine is big-end.\n");    }    return 0;}


0 0
原创粉丝点击