如何使用union处理浮点数据?

联合体(union)的使用和分析
1、联合体
联合体(union)与结构体(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在联合体中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
2、声明共用体类型
一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型。
联合变量的声明和结构变量的声明方式相同, 也有三种形式。
一般形式具体如下:
union 共用体名{   //成员列表   数据类型 成员名;   数据类型 成员名;   ....}  
示例:
union _mq{ char data8[4]; int  data32;};   
3、定义共用体变量
一般形式具体如下:
union _mq{ char data8[4]; int  data32;}; //定义共用体变量union _mq mq;  
合并简化形式具体如下:
union _mq{ char data8[4]; int  data32;}mq;  
匿名结构体形式具体如下:
union { char data8[4]; int  data32;}mq;  
使用 typedef 声明共用体类型,再定义共用体变量:
typedef union mq{ char data8[4]; int  data32;} _mq;//定义共用体变量,以下两种效果一样union mq mq;_mq mq;  
4、上代码:
#include   union test {        unsigned char a;        unsigned short b;        unsigned int c;}; int main(void){        union test test;        printf(%lu, sizeof(union test));        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);        return 0;}  
结果:
44&test = 0x7fff4a0708c4, &test.a = 0x7fff4a0708c4, &test.b = 0x7fff4a0708c4, &test.c = 0x7fff4a0708c4test.c = 11223344test.a = 44test.b = 3344test.c = 11223388test.a = 88test.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类型的数据就不能直接传输了,需要进行转化,使用联合体就可以很方便的进行“自动转换”了


华灿光电“倒装发光二极管芯片及其制作方法”获权威认可
智能医疗的发展将提高医疗行业的救治效率
LG将携八款8K TV系列亮相CES 2020
使用小尺寸、引脚式SOT-23薄型多路复用器克服最后时刻的需求变化
5G和未来网络战略研讨会召开,商讨如何部署与推进5G的商用
如何使用union处理浮点数据?
寻找人工智能外星人的原因是什么
韩国打造两座智慧城市 作为探索智慧城市模式的测试项目
菱电电控:广汽研究院通知开发试制ECU、MCU相关工作
膨体聚四氟乙烯防水透气材料透气薄膜的种类有哪些
中微爱芯 全网最详细的国产74系列通用逻辑IC可替代;TI.NXP.ON多种型号详细资料如下
索尼PS5手柄外观造型曝光,与PS4手柄设计很相似
奥地利微电子推出高集成环境噪声抑制芯片--AS3410/AS
智控LED灯泡Hue拆解:最聪明智能照明,如何做到?
多图解析时速超600公里的磁悬浮列车运行原理
传10.9寸iPad Pro为无边框设计,Home键被干掉
Nvidia、NXP等芯片供货商争夺自动驾驶高地
C语言const关键字的用法
可编程控制器的组成 可编程控制器有哪些特点?
破案了!真的是“玉兔”接“嫦娥”!嫦娥五号创造5项中国首次!