新聞中心

共用體union的妙用

作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
結(jié)構(gòu)體struct是一個常用的數(shù)據(jù)類型,主要是將各種類型的數(shù)據(jù)打包成一個新的數(shù)據(jù)類型,在驅(qū)動開發(fā),寄存器的定義等方面都有比較大的優(yōu)勢。在使用的過程中需要注意空結(jié)構(gòu)體的大小以及對齊(8字節(jié))對數(shù)據(jù)大小的影響。具體的應(yīng)用就不說了。另一個與struct非常相近的數(shù)據(jù)類型union則相對運(yùn)用的較少,但是如果理解了union的本質(zhì)就會發(fā)現(xiàn)該數(shù)據(jù)類型的好處。
union主要是將各種類型的數(shù)據(jù)存放在一段固定的存儲器中,存儲器的大小由union中需要最大存儲器的數(shù)據(jù)類型決定。比如:
union student
{
char ***;
int age;
long number;
double score;
};
其中l(wèi)ong、double需要16個字節(jié),而char 只需要1個字節(jié),因此該共用體占用16個字節(jié)。union的關(guān)鍵是不同的數(shù)據(jù)類型共用存儲器。
主要的運(yùn)用:
1、確定CPU的模式:大端、小端模式確定
大小端不同,則存儲的方式也存在差別,比如int需要4個字節(jié),而char只需要1個字節(jié),根據(jù)1個字節(jié)所在的具體位置即可判定CPU的模式
union TestCPU
{
int i;
char ch;
};
void testCPUMode(void)
{
union TestCPU Test;
Test.i = 1;
if(Test.ch == 1)
{
//這個CPU是小端模式
}
else
{
//這種情況下就是大端模式
}
}
2、實現(xiàn)不同數(shù)據(jù)之間的類型轉(zhuǎn)換
union Type
{
int i;
char ch;
long lint;
....
};
...
union Type type;
這樣各種類型的數(shù)據(jù)共用存儲空間,很方便的實現(xiàn)了不同數(shù)據(jù)類型之間的轉(zhuǎn)換,不需要顯示的強(qiáng)制類型轉(zhuǎn)換。
union相比struct更加的節(jié)省空間。
3、寄存器的定義,實現(xiàn)整體的訪問和單項的訪問。
struct register
{char a;
char b;
char c;
char d;
};
union Register
{
struct register;
int whole;
};
這樣就能實現(xiàn)單項和整體的訪問,特別是引入位域操作等相關(guān)結(jié)構(gòu)以后,能夠?qū)崿F(xiàn)每一個bit的訪問。
其他的優(yōu)勢需要總結(jié),我暫時寫這三點(diǎn)了。


評論


技術(shù)專區(qū)

關(guān)閉