1. 程式人生 > >共用體Union

共用體Union

union是很少見的一種資料格式,接觸c以來,真的很少用到,而在最近的工作專案中,需要除錯一款陀螺儀,
而在其stm324xx系列的SDK原始碼中,發現在使用union,好奇之下,翻了翻《C++PrimerPlus》,大致瞭解到這種
資料格式,記錄如下

一、什麼是共用體?

它是一種特殊的資料格式,它能夠儲存不同的資料型別,但只能同時儲存其中的一種型別,也就是說:

  • 結構可以同時儲存int、longdouble
  • 共用體的句法與結構相似,但含義不同
  • 共同體的長度為其最大成員的長度
union one4all
{
	int  int_val;
	long long_val;
	double double_val;
};

可以使用one4all變數來儲存int、longdouble,條件是在不同的時間進行:

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_numid_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可以方便的解析出四元數。