0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_L18yujSQ 来源:小飞哥玩嵌入式 2023-05-15 09:47 次阅读

联合体(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、上代码:

#include

unionTest{
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、给联合体某个成员赋值时会影响到另外一个成员的数值,如下图:

d0a24406-f29c-11ed-90ce-dac502259ad0.png

如果是小端模式:

变量高位是放高地址、变量低位是放低地址。这里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。

利用联合体处理浮点型数据

经过上面对联合体的简单介绍,想必不少同学已经知道小飞哥接下来要说什么了吧

直接上测试代码:d0ba6540-f29c-11ed-90ce-dac502259ad0.png

测试结果是什么呢?

d107397e-f29c-11ed-90ce-dac502259ad0.png

输入的浮点数是6.91,我们可以看到uint8_data也有了4个值,从联合体的定义来看,这两个值应该是一样的,我们来验证下是不是如此:

浮点转16进制还是挺麻烦的,有精力的同学可以自己算算,没精力的同学可以使用这个链接的在线转换工具

http://xnkiot.com/#/floating

转换之后的结果跟我们上面代码运行的结果是一致的d1496f06-f29c-11ed-90ce-dac502259ad0.png

那这个转换有什么意义呢?我们经常通讯串数过程中,比如串口传输的事单字节数据,对于float类型的数据就不能直接传输了,需要进行转化,使用联合体就可以很方便的进行“自动转换”了

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6867

    浏览量

    88800
  • 内存
    +关注

    关注

    8

    文章

    2996

    浏览量

    73870
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28327
  • 结构体
    +关注

    关注

    1

    文章

    129

    浏览量

    10832
  • union
    +关注

    关注

    0

    文章

    10

    浏览量

    4252

原文标题:如何使用union处理浮点数据?

文章出处:【微信号:小飞哥玩嵌入式,微信公众号:小飞哥玩嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    labview和单片机通讯浮点数如何处理

    通过labview和下位机单片机通过串口通讯,对于浮点数,如果上位机要把浮点数传给下位机 或者下位机(单片机)要把浮点数传给上位机(labview)浮点数需要如何
    发表于 06-06 21:05

    单片机浮点数转十六进制,串口接收浮点数处理

    经验 浮点转十六进制:/*作用:浮点数---转---十六进制 */ union fnum{long int m;float f; };然后需要在引用的函数内声明共用体比如:union
    发表于 07-18 14:57

    数据转换:十六进制与浮点数的互相转换

    数据转换:十六进制与浮点数的互相转换在DSP上做数据处理遇到,浮点型存储格式,转换成十进制的浮点型参与运算。最终通过用
    发表于 10-25 14:57

    点数浮点数的区别是什么

    点数浮点数的区别目的:理解定点数浮点数在傅里叶变换(FFT)的实际应用中的选择单片机中如果需要进行一定的运算(常见的傅里叶变换)时,需要在不同情况下对AD采集的
    发表于 02-21 07:22

    浮点数在单片机数据采集监控系统中的应用

    单片机能够直接处理的数是定点数,然而实际上需要输入、处理和显示的数据却是浮点数,本文详细介绍了浮点数
    发表于 08-13 15:38 44次下载

    浮点数的表示方法

    浮点数的表示方法  浮点数,是指小数点在数据中的位置可以左右移动的数据。它通常被表示成:    N = M* RE  这里的M(Mantissa)被称为
    发表于 10-13 17:13 1.6w次阅读
    <b class='flag-5'>浮点数</b>的表示方法

    浮点数常用的编码方法

    浮点数常用的编码方法  前面已经说到,在计算机内,浮点数被表示为如下格式:    通常情况
    发表于 10-13 17:21 4447次阅读
    <b class='flag-5'>浮点数</b>常用的编码方法

    32位浮点数字信号处理器SHARC产品组合(ADI)

    32位浮点数字信号处理器SHARC产品组合(ADI) Analog Devices, Inc.,全球领先的高性能信号处理解决方案供应商,最新推出32位浮点数
    发表于 04-10 09:59 1305次阅读

    modbus 如何读取浮点数

    本文为大家介绍modbus读取浮点数的两个程序设计。
    发表于 02-08 10:03 1.4w次阅读

    FLASH存储浮点数据的解决办法

    需求: 参数的数据类型为浮点数据,需要存储至FLASH中。解决办法:采用联合体联合体特性:联合体内的参数,共用一块内存。案例://构建联合体数据结构typedef union{ f
    发表于 12-02 12:21 6次下载
    FLASH存储<b class='flag-5'>浮点数据</b>的解决办法

    如何在FPGA中正确处理浮点数运算

    使用插值算法实现图像缩放是数字图像处理算法中经常遇到的问题。我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。由于在缩放的过程中会遇到浮点数,如何在FPGA中正确的处理浮点数
    的头像 发表于 03-18 11:03 4989次阅读

    谈一谈浮点数的精度问题

    还是要从浮点数的存储和标识出发来处理该问题,既然浮点数天然就存在一定的误差,而有时候计算又无法获得唯一的数值,如下图所示,浮点数计算出来的实轴上的值都会因为
    的头像 发表于 08-11 14:28 4458次阅读
    谈一谈<b class='flag-5'>浮点数</b>的精度问题

    什么是浮点数浮点数在内存中的存储

    浮点型简单讲就是实数的意思。浮点数在计算机中用以近似表示任意某个实数。
    的头像 发表于 11-09 11:07 5186次阅读
    什么是<b class='flag-5'>浮点数</b>?<b class='flag-5'>浮点数</b>在内存中的存储

    什么是浮点数

    Python数据类型第一种:字符串(str)。 Python数据类型第二种:整数(int)。 Python数据类型第三种:浮点数浮点数
    的头像 发表于 02-23 14:58 4489次阅读

    modbus浮点数怎么读取

    Modbus是一种通信协议,常用于工业自动化系统中的设备之间的通信。它支持多种数据类型,包括整数、浮点数、字符串等。浮点数在工业领域中广泛应用,因此了解如何读取和处理Modbus
    的头像 发表于 12-28 14:38 5805次阅读