联合体union和大小端(big-endian、little-endian)

1.联合体union的基本特性——struct的同与不同

union,中文名联合体、共用体,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

在成员完全相同的情况下,structunion占用的内存要多一些。

原因是Cstructunion的内存分配机制不同:

struct中,所有的成员都有自己的存储空间,而且为了便于寻址和管理,所有的数据成员都要遵循内存对齐的规则;

union中,所有的成员共用一块存储空间,在操作不同的成员时,编译器依据不同的成员类型,按照不同的方式取值。

2.联合体union所占内存空间大小:

#include<stdio.h>
union unionTest{
        int a;
        double b;
}
main(){
        union unionTest test;
        printf("The sizeof of test is %d\n",sizeof(test));       
}

结果:

The sizeof of test is 8

说明:联合体所分配内存空间的大小为联合体中所占字节最大成员的大小。

3.联合体union和大小端(big-endianlittle-endian): 

#include<stdio.h>
union var{
        char c[4];
        int i;
};
int main(){ union var data; data.c[0] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~ data.c[1] = 0x03;//写成16进制为了方便直接打印内存中的值对比 data.c[2] = 0x02; data.c[3] = 0x11;//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
//而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。 printf("%x\n",data.i); }

结果:

11020304

说明我的32位win7系统为小端方式。

 

 

 

posted @ 2015-03-26 13:41  馨梦缘  阅读(2548)  评论(0编辑  收藏  举报