当前位置:网站首页>共用体Union
共用体Union
2022-06-29 09:10:00 【水似冰】
union是很少见的一种数据格式,接触c以来,真的很少用到,而在最近的工作项目中,需要调试一款陀螺仪,
而在其stm324xx系列的SDK源码中,发现在使用union,好奇之下,翻了翻《C++PrimerPlus》,大致了解到这种
数据格式,记录如下
一、什么是共用体?
它是一种特殊的数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型,也就是说:
- 结构可以同时存储
int、long和double - 共用体的句法与结构相似,但含义不同
- 共同体的长度为其最大成员的长度
union one4all
{
int int_val;
long long_val;
double double_val;
};
可以使用one4all变量来存储int、long和double,条件是在不同的时间进行:
one4all pail;
pail.int_val = 15; //store an int
cout << pail.int_val;
pail.double_val = 1.38;
cout << pail.double_val; //store a double, int value is lost
因此pail有时可以是 int 变量,有时又可以是 double变量。由于共同体每次只能存储一个值,因此它必须有足够
的空间来存储最大的成员。
二、共同体的用途
1、节约空间
- 当数据项使用两种或多种数据格式而又不会同时使用时,可节省空间
例如,假设管理一个小商品目录,其中一些商品的ID为整数,而另一些的ID为字符串。在这种情况下,可以这样做:
struct widget
{
char brand[20];
int type;
union id
{
long id_num;
char id_char[20];
}
};
widget prize;
if(prize.type ==1)
{
cin >> prize.id_num;
}
else
{
cin >> prize.id_char;
}
匿名共同体(anonymous union)没有名称,其成员将成为位于相同地址处的变量。显然,每次只有一个成员是当前的成员。
由于共用体时匿名的,因此 id_num和 id_char 被视为 prize 的两个成员,它们的地址相同,所以不要标识符,程序员负责确定当前那个成员是活动的。
共同体常用于节省内存,常用于嵌入式系统编程,对某些板载程序来说,内存是非常宝贵的,此外共同体也常用于操作系统数据结构或硬件数据结构。
2、数据解析
- 应用场景是某传感器的数据存储为
unsinged char的数组,而该数组存储的是float的数据。可用union来解析。
bool trunQHexToFloat(unsigned char src[],int len,float *Qval)
{
if( len != 4 || Qval==NULL)
{
return false;
}
typedef union
{
unsigned char QvalHex[4];
float QvalFloat;
}QHexTof;
QHexTof data;
data.QvalHex[0] = src[0];
data.QvalHex[1] = src[1];
data.QvalHex[2] = src[2];
data.QvalHex[3] = src[3];
*Qval=data.QvalFloat;
return true;
}
void main()
{
float testA;
unsigned char sampleA[]={
0xab,0x5c,0x0b,0xbe} ;
int len = sizeof(sampleA)/sizeof(unsigned char);
trunQHexToFloat(sampleA,len,&testA);
printf("QVAL IS %f\n",testA);
}
在工作中遇到的传感器是陀螺仪,本段demo可以方便的解析出四元数。
边栏推荐
- Implementation of multi key state machine based on STM32 standard library
- Monitoring data source connection pool usage
- GD32F4xx 以太網芯片(enc28j60)驅動移植
- Visual assist plug-in settings for UE4 vs
- Closed training (25) basic web security
- In the era of data processing, data quality construction is the way for enterprises to survive
- 【NOI模拟赛】为NOI加点料(重链剖分,线段树)
- Generic paging framework
- 动态规划总结
- 数据可视化:数据可视化四象限,教你正确应用图标
猜你喜欢

MATLAB小技巧(21)矩阵分析--偏最小二乘回归

阿里云服务器安装配置redis,无法远程访问

Fully Automated Delineation of Gross Tumor Volume for Head and Neck Cancer on PET-CT Using Deep Lear

CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION

基於PyQt5和Qt Designer的簡易加法計算器的制作

Custom MVC framework implementation

Lc236. nearest common ancestor of binary tree

User level threads and kernel level threads

基于keil5自动配置stm32f103标准库的官网freertos移植

用户级线程和内核级线程
随机推荐
watch监听和computed计算属性的使用和区别
微信小程序实现数据侦听器watch,包含销毁watch和子属性的watch
我想要股票开户优惠,怎么得到?还有,在线开户安全么?
用户级线程和内核级线程
1.4 机器学习方法之回归问题
数据源连接池未关闭的问题 Could not open JDBC Connection for transaction
After installing anaconda, you need to enter a password to start jupyterlab
Lc236. nearest common ancestor of binary tree
c#判断数组是否包含另一个数组的任何项
Implementation of multi key state machine based on STM32 standard library
长安链GO语言智能合约编写与编译
Es error nonodeavailableexception[none of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
Application of decorator mode, packaging ServletRequest and adding addparameter method
2020-09-25 boost库的noncopyable,用于单例模式
Chang'an chain go language smart contract writing and compilation
[technology development] development and design of alcohol tester solution
CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION
通用分页框架
[Huawei certification] the most complete and selected question bank in hcia-datacom history (with answer analysis)
Cloud management platform: 9 open source cloud management platforms (CMP)