联合体(union)的使用和分析
1、联合体
联合体(union)与结构体(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在联合体中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
2、声明共用体类型
一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型。
联合变量的声明和结构变量的声明方式相同, 也有三种形式。
一般形式具体如下:
union共用体名 { //成员列表 数据类型成员名; 数据类型成员名; .... }
示例:
union_MQ { chardata8[4]; intdata32; };
3、定义共用体变量
一般形式具体如下:
union_MQ { chardata8[4]; intdata32; }; //定义共用体变量 union_MQmq;
合并简化形式具体如下:
union_MQ { chardata8[4]; intdata32; }mq;
匿名结构体形式具体如下:
union { chardata8[4]; intdata32; }mq;
使用 typedef 声明共用体类型,再定义共用体变量:
typedefunionMQ { chardata8[4]; intdata32; }_MQ; //定义共用体变量,以下两种效果一样 unionMQmq; _MQmq;
4、上代码:
#includeunionTest{ unsignedchara; unsignedshortb; unsignedintc; }; intmain(void) { unionTesttest; printf("%lu ",sizeof(unionTest)); printf("%lu ",sizeof(test)); printf("&test=%p,&test.a=%p,&test.b=%p,&test.c=%p ",&test,&test.a,&test.b,&test.c); test.c=0x11223344; printf("test.c=%x ",test.c); printf("test.a=%x ",test.a); printf("test.b=%x ",test.b); test.a=0x88; printf("test.c=%x ",test.c); printf("test.a=%x ",test.a); printf("test.b=%x ",test.b); return0; }
结果:
4 4 &test=0x7fff4a0708c4,&test.a=0x7fff4a0708c4,&test.b=0x7fff4a0708c4,&test.c=0x7fff4a0708c4 test.c=11223344 test.a=44 test.b=3344 test.c=11223388 test.a=88 test.b=3388
结果分析:
1、联合体的大小为最大成员的大小,在联合体union Test中unsigned int是最大的占4个字节。
2、联合体共用一块内存,其内存大小为最大成员的内存大小,所以所以成员的地址都一样,&test = &test.a = &test.b = &test.c。
3、给联合体某个成员赋值时会影响到另外一个成员的数值,如下图:
如果是小端模式:
变量高位是放高地址、变量低位是放低地址。这里test.c=0x11223344指11为高位、44为低位。
栈区遵循“先进后出、后进先出”的规则,即打印的时候从高地址到地址依次打印,所以test.c打印值为11223344。
从上图可以看出,test.a、test.b和test.c的起使地址都是44对应的地址,所以他们的地址都是一样的。
如果test.a = 0x88,那么test.a、test.b和test.c本来的值都会发生改变,即test.a = 88,test.b = 3388,test.c = 11223388。
利用联合体处理浮点型数据
经过上面对联合体的简单介绍,想必不少同学已经知道小飞哥接下来要说什么了吧
直接上测试代码:
测试结果是什么呢?
输入的浮点数是6.91,我们可以看到uint8_data也有了4个值,从联合体的定义来看,这两个值应该是一样的,我们来验证下是不是如此:
浮点转16进制还是挺麻烦的,有精力的同学可以自己算算,没精力的同学可以使用这个链接的在线转换工具
http://xnkiot.com/#/floating
转换之后的结果跟我们上面代码运行的结果是一致的
那这个转换有什么意义呢?我们经常通讯串数过程中,比如串口传输的事单字节数据,对于float类型的数据就不能直接传输了,需要进行转化,使用联合体就可以很方便的进行“自动转换”了
审核编辑:汤梓红
-
数据
+关注
关注
8文章
6867浏览量
88800 -
内存
+关注
关注
8文章
2996浏览量
73870 -
变量
+关注
关注
0文章
613浏览量
28327 -
结构体
+关注
关注
1文章
129浏览量
10832 -
union
+关注
关注
0文章
10浏览量
4252
原文标题:如何使用union处理浮点数据?
文章出处:【微信号:小飞哥玩嵌入式,微信公众号:小飞哥玩嵌入式】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论