共用體Union
阿新 • • 發佈:2019-02-15
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可以方便的解析出四元數。