天天看點

共用體Union一、什麼是共用體?二、共同體的用途

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可以友善的解析出四元數。