標(biāo)題: C++中Union數(shù)據(jù)結(jié)構(gòu)的使用 [打印本頁]
作者: liuyang 時間: 2012-2-13 23:45
標(biāo)題: C++中Union數(shù)據(jù)結(jié)構(gòu)的使用
聯(lián)合體:Union同結(jié)構(gòu)體struct類似,均可以存儲不同類型的變量,不同的是Union是其成員變量共享一段內(nèi)存空間,內(nèi)存空間按其
存儲體積最大類型的成員變量分別,比如Union有char,int,float型成員變量,則該聯(lián)合體則按float型分配,而各成員變量存儲時起始位
置是相同的。各成員對用的內(nèi)存是分時共享的,正因?yàn)槿绱耍谀骋粫r候,只能使用其中一個成員。聯(lián)合體變量各成員的類型可以是基本的數(shù)據(jù)類型,比如整型、實(shí)
型、字符型等,也可以是數(shù)組、結(jié)構(gòu)體類型甚至聯(lián)合體類型或指針。相反,聯(lián)合體變量也可以作為數(shù)組元素或結(jié)構(gòu)體變量的成員出現(xiàn)。union成員的訪問:基本
變量類型通過"."訪問:即:聯(lián)合體變量名.成員名;指針標(biāo)量則是"->",即:聯(lián)合體變量名->成員名。訪問方式與結(jié)構(gòu)體相同。
應(yīng)用示例:編寫一段程序判斷系統(tǒng)中的CPU是Little endian還是Big endian模式
分析:小端模式(Little
endian)和大端(Big
endian)模式講的是CPU對數(shù)據(jù)存取的字節(jié)順序。小端模式是先存取數(shù)據(jù)的低位字節(jié),再依次存取次高字節(jié),大端模式則相反,先將數(shù)據(jù)的高位字節(jié)存取,
在依次存取次低字節(jié)數(shù)據(jù)。這好比吃甘蔗,假設(shè)以甘蔗的根部一節(jié)比喻大端(數(shù)據(jù)的高位字節(jié)),頂部一節(jié)比喻小端(數(shù)據(jù)的低位字節(jié)),一節(jié)一節(jié)地按順序砍下來
吃,大端模式則從根部砍起,小端模式則從頂端砍起。假設(shè)我們要將0x1234abcd寫入到以0x0000開始的內(nèi)存中,下圖的存儲方式可以直觀地表現(xiàn)出
兩種存取模式。
地址 | 0x0000 | 0x0001 | 0x0002 | 0x0003 |
big-endian | 0x12 | 0x34 | 0xab | 0xcd |
little-endian | 0xcd | 0xab | 0x34 | 0x12 |
而CPU對內(nèi)存地址的讀寫由數(shù)據(jù)指針寄存器決定,一般是由內(nèi)存地址的低向高的順序的。
一般來說,x86系列CPU都是little-endian的字節(jié)序,PowerPC通常是Big
endian,還有的CPU能通過跳線來設(shè)置CPU工作于Little endian還是Big
endian模式。而MS51單片機(jī)則有些特殊,內(nèi)存是分區(qū)的,其中有一段是堆棧區(qū),眾所周知,堆棧的存取既不是大端也不是小端是FILO的。
利用union測試CPU的例程(函數(shù)):
int checkCPU()
{
{
union w
{
int a; //整形成員變量4B
char b; //字符型變量1B
} c; //define union object "c"
c.a = 1; //賦初值1,a=b=0x01
if(c.b==1)
cout<<"The endian of cpu is little\n"; //1存于低位字節(jié),b在低8位
else
cout<<"The endian of cpu is big\n"; //1存于高位字節(jié),b在低8位
}
}
這只是一個檢測函數(shù),還需用main函數(shù)調(diào)用
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |