其一:在union的所有數(shù)據(jù)成員中,同一時(shí)間只能存儲(chǔ)一個(gè)數(shù)據(jù)成員。所有數(shù)據(jù)成員具有相同的地址,其空間的大小,以最大數(shù)據(jù)成員為準(zhǔn)。eg:
union
StateMachine
{
};
一個(gè)union只能設(shè)置一個(gè)足夠大的空間來存儲(chǔ)一個(gè)最大長度的數(shù)據(jù)成員,對于上述的例子而言:最大的長度為double型,所以StateMachine的空間大小就是double數(shù)據(jù)類型的大小。
eg.
unon
{
};*p.u
p=&u;
p->a[0]=0x39;
p->a[1]=0x38;
p.i的值應(yīng)該為多少?
這里需要考慮存儲(chǔ)的模式:大端和小端
大端模式(Big_endian):字?jǐn)?shù)據(jù)的高字節(jié)存儲(chǔ)在低地址中,而字?jǐn)?shù)據(jù)的低字節(jié)則存放在高地址中。
小端模式(Little_endian):字?jǐn)?shù)據(jù)的 高字節(jié)存儲(chǔ)在高地址中,而字?jǐn)?shù)據(jù)的低字節(jié)則存放在低地址中。
union 型數(shù)據(jù)所占的空間等于其最大的成員所占的空間。對union 型的成員的存取都是相對于該聯(lián)合體基地址的偏移量為0 處開始,也就是聯(lián)合體的訪問不論對哪個(gè)變量的存取都是從union 的首地址位置開始。由此可以看出p.i的值應(yīng)為0x39.
其三:如何確認(rèn)當(dāng)前系統(tǒng)的存儲(chǔ)模式
請寫一個(gè)C 函數(shù),若處理器是Big_endian 的,則返回0;若是Little_endian 的,則返回1。
以大端模式存儲(chǔ),其內(nèi)存布局如下圖:

以小端模式存儲(chǔ),其內(nèi)存布局如下圖:

變量i 占4 個(gè)字節(jié),但只有一個(gè)字節(jié)的值為1,另外三個(gè)字節(jié)的值都為0。如果取出低
地址上的值為0,毫無疑問,這是大端模式;如果取出低地址上的值為1,毫無疑問,這是
小端模式
程序如下:
int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}
不過要說明的一點(diǎn)是,某些系統(tǒng)可能同時(shí)支持這兩種存儲(chǔ)模式,你可以用硬件跳線或在編譯器的選項(xiàng)中設(shè)置其存儲(chǔ)模式。