C语⾔之联合(union)的妙⽤
union Data {
int i;
char str[4];
} data;
它有什么属性呢?这段代码定义了⼀个名为data的union变量。它有什么属性呢?
1.这个变量在内存中占⽤4个字节的空间⽽不是8个;
2.有两个数据成员:int类型变量的i和char类型的数组str;
3.虽然有两个数据成员,但是这两个成员的存储空间是⼀样的。
上⾯三点是union变量的最基本也是最重要的属性。详细说⼀下第三点。因为union不论包含多少个多少种数据类型,它实例化为变量后,这个变量的长度是这个union中最长的数据类型的长度。下⾯的代码定义了⼀个union变量。它的长度是16个字节。
union DEMO{
char status;
int a;
int serial[4];
}demo;
上⾯这个表格代表内存中的数据,demo.status 的值为0x1;demo.a的值为,0x4321。以此类推demo.serial的值就出来了。这个属性是union特有的。
C语⾔的发明者为什么要弄这么个数据类型呢?现在知道了吧。因为这个union特有的属性可以帮助我们节省好多⾏代码。⽽且还不⽤各种基础数据类型转换。
union的应⽤
设想⽤C语⾔实现这样⼀个功能。我需要⽤单⽚机读取⼀个监控温度的i2c slave的寄存器数据。这个寄
存器是12位有效位寄存器。读出来之后我们要通过数据⼿册给定的公式计算成实际温度(设想这个公式为 temp = reg_val *10)。我们怎么实现呢?要知道,i2c的数据传输是按照byte传送的,也就是说,你只能⽤char类型结束数据,说⽩了,每个时序你只能接收8个bit的数据。所以12个bit需要读两次,⽤两个char类型变量或⼀个char类型数据接收。
union是什么类型1. 读出寄存器数据(这个不在这篇⽂章的讨论范围内)
2. 将读出的数据转换成可计算的数据类型(两个char类型转换成⼀个short或int或float类型)
3. 根据公式计算
下⾯看⼀下不⽤union实现的函数
int fun( void )
{
int tmp_value = 0;
char reg_val[2] = {0,0};
.
...
tmp_value = (reg_val[1]<<8 | reg_val[0]);
return tmp_value*10;
}
⽤union的
union REG_VAL {
int value;
char buf[2];
}reg_val;
int fun( void )
{
int tmp_value = 0;
char reg_val[2] = {0,0};
....
return reg_val.value*10;
}
不⽤union的函数也可以⽤sprintf实现,那就更⿇烦了。
可以看到虽然在这⾥⽤union的代码⽐不⽤union的多了⼏⾏,但是i2c sensor如果多的话,那就会少很多,⽽且i2c sensor的寄存器有效位数不是⼀样的,这个⽤两个char类型就解决了,但是其他的可能需要⽤三个,所以⽤最上⾯定义的union变量可以很好的实现,不需要考虑各种转换问题。
union还是很有⽤处的,所以不要忽视它了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论