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
的資料。可用union來解析。float
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可以友善的解析出四元數。