当前位置:网站首页>共用体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可以方便的解析出四元数。
边栏推荐
- cenos7下搭建LAMP环境
- Data warehouse: layered architecture of Finance / banking
- Custom MVC framework implementation
- MATLAB小技巧(21)矩阵分析--偏最小二乘回归
- Wechat applet realizes store function
- LC236. 二叉树的最近公共祖先
- 基於PyQt5和Qt Designer的簡易加法計算器的制作
- Simplicity studio does not recognize the new JLINK V9 solution
- kdevelop新建工程
- Print service IP setting scheme
猜你喜欢

Self cultivation (XXI) servlet life cycle, service method source code analysis, thread safety issues

KiCad学习笔记--快捷键

Easyexcl export 1million lines of EXECL report font error solution

Visual assist plug-in settings for UE4 vs

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

Five heart charity matchmaker team

Gross Tumor Volume Segmentation for Head and Neck Cancer Radiotherapy using Deep Dense Multi-modalit

长安链数据存储介绍及Mysql存储环境搭建

Simplicity Studio无法识别新买的JLink v9解决方法

Closed training (25) basic web security
随机推荐
c#判断数组是否包含另一个数组的任何项
GD32F4xx 以太网芯片(enc28j60)驱动移植
如何将谷歌浏览器设置为默认浏览器
MySQL modify auto increment initial value
UE4 material UV texture does not stretch with model scale
Data visualization: the significance of data visualization
A 3D Dual Path U-Net of Cancer Segmentation Based on MRI
官方stm32芯片包下载地址 stm32f10x stm32f40x下载
Wechat applet rewrites the page function to realize global logging
CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION
Gross Tumor Volume Segmentation for Head and Neck Cancer Radiotherapy using Deep Dense Multi-modalit
The principle of session and cookie
General part: cognition, design and best practice of prototype design
Self cultivation (XXI) servlet life cycle, service method source code analysis, thread safety issues
Surveiller l'utilisation du pool de connexion des sources de données
Segmentation of Head and Neck Tumours Using Modified U-net
es报错NoNodeAvailableException[None of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
滑块验证代码
GD32F4xx 以太網芯片(enc28j60)驅動移植
cenos7下搭建LAMP环境