标题: 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