【union】——c中union的妙用

c, union
转载自:https://blog.csdn.net/BLUCEJIE/article/details/103503638

union作为C语言的一个关键字跟关键字volatile一样很少出现在程序员 的视野之中,当然相比于volatile,union的处境相对还好一点。但是我总觉得他是C语言的弃儿。
那么union与指针有什么关系呢?答案是有,我们都知道union的成员变量是共享同一块内存的,所以我们在使用union时会特别注意union在内存中的形态。与内存有关就与指针有关。

有的读者可能从开始学C语言就不觉的union有什么用,甚至有的读者学习和使用很长时间的C语言都从来没有使用过union。当然,几乎所以的应用在不使用union的情况下都可以实现。但是有时候使用它会有意想不到的效果。下面我主要列举union两方面的应用:

1.做嵌入式软件开发的读者都知道,我们几乎所有的通信方式传输的都是字节流,但是我们要传输的实际数据却各种各样,有float、double、int甚至是结构体。我们在传输之前往往需要将这些数据类型转换成字节流。以串口通信为例,假设单片机采集温度传感器的温度值为float型的数据,单片机采集到数据后需要把数据通过串口发送给上位机。这是我们遇到的问题是怎么把float的数据准确无误的转换为unsigned char型的数据,而上位机接收到数据后又怎样把unsigned char型的数据转换为float?
这时union就登上了历史的舞台,你可能有其他的转换方法但union无疑是最方便的。我们都知道float在内存中占4个字节,而unsigned char型的数据在内存中占1个字节。另外数据在内存中实际的存储形态都是二进制的01形态。而我们眼中的的float和unsigned char在内存眼里毫无区别。于是我们就用一个union作为一个转换器,输入float输出四个unsigned char,输入四个unsigned char输出一个float。废话少说代码如下:

union Converter
{
	float Float;
	unsigned char Uint[4];
};
#include <stdio.h>

union Converter
{
    float Float;
    unsigned char Uint[4];
};

int main()
{
    union Converter var1, var2;
    int i;
    //下位机转化为unsigned char
    var1.Float = 12.356;
    printf("var1:%f\n", var1.Float);
    
    //模拟串口传输过程
    for (i = 0; i < 4; i++) {
        var2.Uint[i] = var1.Uint[i];
    }
    //上位机接收到了数据
    printf("var2:%f\n", var2.Float);
    return 0;
}

在这里插入图片描述

疑问

  • 如何将数据类型转换成字节流
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值