[转载+探讨]union的用法

  笔者编码经验比较少,union只知概念,几乎没用过。昨日看到在UNP上一个示例程序如下

判断系统使用大端还是小端
1 #include "stdio.h"

 2 int 
 3 main(int argc, char **argv)
 4 {
 5     union {
 6         short   s;
 7         char    c[sizeof(short)];
 8     } un;

 9     un.s = 0x0102;
10     printf("%s: ", CPU_VENDOR_OS);
11     if (sizeof(short) == 2) {
12         if (un.c[0] == 1 && un.c[1] == 2)
13             printf("big-endian\n");
14         else if (un.c[0] == 2 && un.c[1] == 1)
15             printf("little-endian\n");
16         else
17             printf("unknown\n");
18     } else
19         printf("sizeof(short) = %d\n", sizeof(short));

20     exit(0);
21 }

  对un.s理解了半天,才明白它是以s的类型填充,又以c的类型访问。以前仅限于“需要存什么类型就存什么”的简单理解。而后看了一篇博文和某一回复,更是有所启发。地址:http://www.cnblogs.com/liuyazhou/archive/2010/03/30/1700823.html和3#的回复,下面把它转载过来了,留档备用。

 
很变态的一个union

朋友给我发的一个题,是关于union的。我知道union共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且只能储存其中一个成员变量的值。但这个程序的结果还是让我破感意外。现在也没有琢磨出为什么会是这样。

程序如下:

 

#include <iostream>    
using namespace std;    
   
struct byte    
{    
     unsigned int a1:1;    
     int a2:1;    
     int a3:1;    
     int a4:1;    
     int a5:1;    
     int a6:1;    
     int a7:1;    
     int a8:1;    
};    
   
union b    
{    
    char c;    
    struct byte bit;    
}union_a;    
   
int main(int argc, char *argv[])    
{    
    union_a.c = 'A';   
    cout <<(union_a.bit.a7 + union_a.bit.a1) << endl;         
    return 0;    
}   

 

运行结果为0.

感到不解,于是输出了a1-a8的所有值。其中a1=1,a7=-1,其他均为0.

 有高手可以分析一下这是怎么回事吗?

 
3#回复
2010-03-30 21:33 | 步碎酒散花醉      
@newhi
sizeof(byte)=4是因为你的struct中的数据类型的最大长度是4 就是int的长度 虽然总共申明的长度只有1byte但是仍然占4个byte空间 编译器使然 这块可以详细了解下 很玄妙...- -
A=65=0x41=(01000001)2
如此 a1=1 a7=1 其余全为0了
就是这个样子
a1是unsigned int 换成十进制就是1
a7是int 计算机按补码表示 换成十进制就是-1

可以在调试的时候进入内存看一下数据是什么样的
 
posted @ 2012-04-13 09:41  五岳  阅读(307)  评论(0编辑  收藏  举报
回到顶部