关于union联合体类型的讨论(转)

来源:互联网 发布:保定移动网络太垃圾 编辑:程序博客网 时间:2024/05/17 23:30
联       合(union)

    1. 联合说明和联合变量定义 
    联合也是一种新的数据类型, 它是一种特殊形式的变量。 
    联合说明和联合变量定义与结构十分相似。其形式为: 
     union 联合名{ 
          数据类型 成员名; 
          数据类型 成员名; 
          ... 
     } 联合变量名; 
    联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量。 
    下例表示说明一个联合a_bc: 
     union a_bc{ 
          int i; 
          char mm; 
     }; 
    再用已说明的联合可定义联合变量。 
    例如用上面说明的联合定义一个名为lgc的联合变量, 可写成: 
      union a_bc lgc; 
    在联合变量lgc中, 整型量i和字符mm公用同一内存位置。 
    当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度。 
    联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时, 也要用"->"符号, 此时联合访问成员可表示成: 
     联合名->成员名 
    另外, 联合既可以出现在结构内, 它的成员也可以是结构。 
    例如: 
     struct{ 
          int age; 
          char *addr; 
          union{ 
               int i; 
               char *ch; 
          }x; 
     }y[10]; 
    若要访问结构变量y[1]中联合x的成员i, 可以写成: 
      y[1].x.i; 
    若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成: 
      *y[2].x.ch; 
    若写成"y[2].x.*ch;"是错误的。

    2. 结构和联合的区别 
    结构和联合有下列区别: 
    1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻,联合中只存放了一个被选中的成员, 而结构的所有成员都存在。 
    2. 对于联合的不同成员赋值, 将会对其它成员重写,  原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。 
    下面举一个例了来加对深联合的理解。 
    例4: 
     main() 
     { 
          union{                    
               int i; 
               struct{              
                    char first; 
                    char second; 
               }half; 
          }number; 
          number.i=0x4241;          
          printf("%c%c\n", number.half.first, mumber.half.second); 
          number.half.first='a';    
          number.half.second='b'; 
          printf("%x\n", number.i); 
          getch(); 
     } 
    输出结果为: 
     AB 
     6261 
    从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。 
  -------------------------------------------------------------------

例:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1

  解答:

int checkCPU()
{
 {
  union w
  { 
   int a;
   char b;
  } c;
  c.a = 1;
  return (c.b == 1);
 }
}

  剖析:

  嵌入式系统开发者应该对Little-endian和Big-endian

        采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到 低字节。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址存放内容0x40000x340x40010x12
  而在Big-endian模式CPU内存中的存放方式则为:

内存地址存放内容0x40000x120x40010x34
  32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址存放内容0x40000x780x40010x560x40020x340x40030x12
  而在Big-endian模式CPU内存中的存放方式则为:

内存地址存放内容0x40000x120x40010x340x40020x560x40030x78
  联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 换奶粉不拉大便怎么办 宝宝和妈妈不亲怎么办 冬天榨果汁太凉怎么办 四个月宝宝拉水怎么办 婴儿吃奶吃撑了怎么办 1岁的宝宝腹泻怎么办 一岁宝宝老拉肚子怎么办 一岁宝宝拉肚子怎么办啊 小孩发烧怎么办39度要吃消炎药吗 孩子不爱吃水果蔬菜怎么办 一岁宝宝不吃水果怎么办 一岁宝宝不爱吃水果怎么办 1岁多宝宝不吃水果怎么办 中学生不爱与家长交流怎么办 孩子一直37度多怎么办 小孩39度3算高烧怎么办 7岁发烧怎么办如何退烧 7岁反复发烧7天怎么办 一岁发烧39.8度怎么办 反复发烧39度4天怎么办 大人发烧到39度怎么办 小孩高烧39度多怎么办 孩子嗓子发炎发烧怎么办吃什么药 猫咪吃了点桃子怎么办 猫吃了牛油果怎么办 苹果手机死机开不了机怎么办 新生儿出生第一天没奶水怎么办 第一天断奶奶水一直流出怎么办 3岁宝宝不长个子怎么办 5个月宝宝不长个怎么办 孩子比同龄人矮很多怎么办 孕妇做春梦宫缩怎么办 减肥掉头发很厉害怎么办 孕妇吃了金枪鱼罐头怎么办 怀孕吃了烂水果怎么办 快递水果压坏了怎么办 谈对象被骗了钱怎么办 如果遇到半夜坏人敲门怎么办 小孩晚上不进房间睡觉怎么办 房子照不到阳光潮湿怎么办 4个月婴儿不拉屎怎么办