[转载+探讨]union的用法

简介:

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

判断系统使用大端还是小端

  对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

可以在调试的时候进入内存看一下数据是什么样的
 




本文转自五岳博客园博客,原文链接:www.cnblogs.com/wuyuegb2312/articles/2445253.html,如需转载请自行联系原作者

目录
打赏
0
0
0
0
20
分享
相关文章
JOIN的用法
【8月更文挑战第2天】JOIN的用法
175 4
|
8月前
Union和Union All到底有什么区别
Union和Union All到底有什么区别
156 1
可以使用 UNION 或者 UNION ALL 来合并多个 SELECT 语句的结果
可以使用 UNION 或者 UNION ALL 来合并多个 SELECT 语句的结果
284 7
union和union all 的区别
union和union all 的区别
283 0
JOIN用法
在实际的数据库应用中,我们经常需要从多个数据表中读取数据,这时我们就可以使用SQL语句中的连接(JOIN),在两个或多个数据表中查询数据。
JOIN用法
SQL语句中union all和union的区别以及用法
SQL语句中union all和union的区别以及用法
189 0
十二、UNION操作符
十二、UNION操作符
113 0
十六、UNION 与 UNION ALL 的使用
十六、UNION 与 UNION ALL 的使用
233 0
十六、UNION 与 UNION ALL 的使用
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等