标题: C++中Union数据结构的使用 [打印本页]
作者: liuyang 时间: 2012-2-13 23:45
标题: C++中Union数据结构的使用
联合体:Union同结构体struct类似,均可以存储不同类型的变量,不同的是Union是其成员变量共享一段内存空间,内存空间按其
存储体积最大类型的成员变量分别,比如Union有char,int,float型成员变量,则该联合体则按float型分配,而各成员变量存储时起始位
置是相同的。各成员对用的内存是分时共享的,正因为如此,在某一时候,只能使用其中一个成员。联合体变量各成员的类型可以是基本的数据类型,比如整型、实
型、字符型等,也可以是数组、结构体类型甚至联合体类型或指针。相反,联合体变量也可以作为数组元素或结构体变量的成员出现。union成员的访问:基本
变量类型通过"."访问:即:联合体变量名.成员名;指针标量则是"->",即:联合体变量名->成员名。访问方式与结构体相同。
应用示例:编写一段程序判断系统中的CPU是Little endian还是Big endian模式
分析:小端模式(Little
endian)和大端(Big
endian)模式讲的是CPU对数据存取的字节顺序。小端模式是先存取数据的低位字节,再依次存取次高字节,大端模式则相反,先将数据的高位字节存取,
在依次存取次低字节数据。这好比吃甘蔗,假设以甘蔗的根部一节比喻大端(数据的高位字节),顶部一节比喻小端(数据的低位字节),一节一节地按顺序砍下来
吃,大端模式则从根部砍起,小端模式则从顶端砍起。假设我们要将0x1234abcd写入到以0x0000开始的内存中,下图的存储方式可以直观地表现出
两种存取模式。
地址 | 0x0000 | 0x0001 | 0x0002 | 0x0003 |
big-endian | 0x12 | 0x34 | 0xab | 0xcd |
little-endian | 0xcd | 0xab | 0x34 | 0x12 |
而CPU对内存地址的读写由数据指针寄存器决定,一般是由内存地址的低向高的顺序的。
一般来说,x86系列CPU都是little-endian的字节序,PowerPC通常是Big
endian,还有的CPU能通过跳线来设置CPU工作于Little endian还是Big
endian模式。而MS51单片机则有些特殊,内存是分区的,其中有一段是堆栈区,众所周知,堆栈的存取既不是大端也不是小端是FILO的。
利用union测试CPU的例程(函数):
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存于低位字节,b在低8位
else
cout<<"The endian of cpu is big\n"; //1存于高位字节,b在低8位
}
}
这只是一个检测函数,还需用main函数调用
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |