[转载+探讨]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#回复
作者:五岳
出处:http://www.cnblogs.com/wuyuegb2312
对于标题未标注为“转载”的文章均为原创,其版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。