C语言之联合体通用变量类型之妙用

本文介绍如何在C语言中使用联合体实现不同类型数据之间的转换,特别适用于处理不同长度和类型的数据。通过定义占用固定字节数的联合体,可以灵活地在多种类型间进行数据读写,有效避免了类型不匹配的问题。

当我们用C语言进行编程时,经常遇到需要将不同类型的变量进行类型转换,我们用得比较多的都是用强转方式进行转换。但是如果我们定义了一个结构体,而这个结构体的成员对象有可能是u8、int_8t、u16、int_16t......等等。那这时候该怎么解决这个问题呢?具体如下:

// ---parameterSet.h

typedef union
{
	u16	 			toDataU16;	
	int16_t	 	    toDataI16;	
	u8 	 			toDataU8;		
	int8_t 	 	    toDataI8;	
	char 			toByte[2];
}byte2Union; // 占用2个字节的联合体


typedef struct
{
    u8             setOID;      // 标识符
    byte2Union     setData;     // 待设置值
    byte2Union     currentData; // 值
    byte2Union     minData;     // 最小值(包含)
    byte2Union     maxData;     // 最大值(包含)    
    u8             setFlag;     // 需要设置标志
    u8             notSetFlag;  // 无需设置到底层模块(0:需要设置 1:不需要设置)            
    u8             signFlag;    // 有符号标志
    u8             Length;      //标识符数据长度
    u32            Address;     // 存储地址
    void (*function)(u8 * ,u16);  // 备注函数指针,处理一些特殊情况    
} parameterSetStruct;         

上面的程序内容中setData、currentData、 minData  、maxData 这几个变量存在需要接收不同长度和类型的数据,我们这边需要接收最长两个字节的数据类型,所以我们定义一个联合体,该联合体占用两个字节空间。同时,在联合体中,我们定义多个不同的类型表达形式名称。这样当我们需要用到不同类型时,只需要如下操作:

//-----mian.c
#include "parameterSet.h"

static parameterSetStruct parameterSet = {0};

int main(void)
{
    parameterSet.setData.toByte[0] = 0x80;
    parameterSet.setData.toByte[1] = 0x01;

    if((parameterSet.setData.toDataU16 > parameterSet.minData.toDataU16) 
     &&(parameterSet.setData.toDataU16 < parameterSet.maxData.toDataU16))
    {
        parameterSet.currentData.toDataU16 = parameterSet.setData.toDataU16;
    }
}

                                                   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Jason

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值