当前位置:网站首页>共用体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可以方便的解析出四元数。
边栏推荐
- 转载 :判断对象是否具有属性的5种方法
- JS获取手机型号和系统版本
- 数据仓库:金融/银行业的分层架构篇
- How to set Google Chrome as the default browser
- cenos7下搭建LAMP环境
- IDEA调试失败,报JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_LOAD(196)
- Es error nonodeavailableexception[none of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
- es报错NoNodeAvailableException[None of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
- mysql修改自动递增初始值
- 你必须知道的23个最有用的Elasticseaerch检索技巧
猜你喜欢

The principle of session and cookie

KiCad学习笔记--快捷键

How to traverse objects in the vector container

【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)

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

How to set Google Chrome as the default browser

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

SPI drive of lsm6dsl

GD32F4xx 以太網芯片(enc28j60)驅動移植

KDevelop new project
随机推荐
How to do unit test well
Self cultivation (XXI) servlet life cycle, service method source code analysis, thread safety issues
Implementation of multi key state machine based on STM32 standard library
1424. diagonal traversal II
2020-09-17 gateway业务流程 两个任务:referer认证和非商品模板化
滑块验证代码
Lc236. nearest common ancestor of binary tree
Data visualization: the significance of data visualization
GD32F4xx 以太網芯片(enc28j60)驅動移植
LC236. 二叉树的最近公共祖先
基于PyQt5和Qt Designer的简易加法计算器的制作
Closed door cultivation (24) shallow understanding of cross domain problems
你知道BFD是什么吗?一文详解BFD协议原理及使用场景
MySQL modify auto increment initial value
证券账号开户安全吗?是靠谱的吗?
Automatic Multi-Organ SegmVentation on Abdominal CT With Dense V-Networks
The former security director of Uber faced fraud allegations and had concealed data leakage incidents
Data governance: the solution of data governance in the data Arena
Cloud management platform: openstack architecture design and detailed interpretation
Slider validation code