鱼C论坛

 找回密码
 立即注册
查看: 2291|回复: 6

union问题求助??????????

[复制链接]
发表于 2012-5-16 19:12:27 | 显示全部楼层 |阅读模式
1鱼币
#include<iostream>
int main(){
   union uni{
      int a;
      char b;
      double c;
   };
   uni un;
   un.a=2;
   un.a=3;
   un.c=5.0;
   std::cout<<un.a<<std::endl;
   return 0;
}
//问题:为什么输出的结果是0,而不是 2 ?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-18 12:51:28 | 显示全部楼层
擦,我都看不懂……表示木有学过C++,不懂std那一句是什么意思,猜测是输出un.a的值对吧?!假如我猜对了,你完全可以相信我下面说的。如果我猜错了,我下面说的,也是有很大的参考价值。
但是我知道union的用法。union定义的结构,里面所有的变量的在内存中的起始地址都是同一个地址。比如说,你的un.a是0-31这一块内存,那么你的un.b是用的0-7这一块儿。而你的un.c则是用的0-63这一块儿内存,他们都有一个共同使用的内存,也就是0-7,对于你main函数中使用的两个,un.a和un.c则有共同使用的0-31这32个bit的内存。你最后一句是un.c=5.0,赋值的同时,也把你原来赋值的un.a=3给抹掉了,原来un.a所在的内存,变成了un.c的低32bit的内存。所以,当你再次调用un
.a的时候,实际上是调用的un.c的低32位内存。而5.0这个浮点数在内存中的表示是:01000000101000……一直是0到满64bit,也就是说,un.c的低32位,填充的全都是0,也就是你调用的un.a所在的内存,全都是0。不知道说到这里,你明白了没有。{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-18 12:52:10 | 显示全部楼层
多谢你的这个问题,让我明白了浮点数在内存中的存储方法……哈哈!:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-18 21:36:18 | 显示全部楼层
楼上说得基本正确,准确地说,double在内存中的表示遵循IEEE754规范中的64位标准(可以自己baidu)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-20 21:06:54 | 显示全部楼层
楼上其实说的很好了!
我还是仔细的说明下吧!
“联合”与“结构”有一些相似之处。
但两者有本质上的不同。
在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和(当然,这里有内存对齐)。
而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。
应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
所以,上面的程序中un.a=2;首先定义a(un.a简称,下同)的值为2,为int型;接着un.a=3;定义a的值为3,把以前的2冲去了,接着un.c=5.0;把c定义为5.0,此时,c为double型,此时c已经覆盖a,就是a已经不存在了。
一般在内存中数值都会被存储为二进制,所以double型被存储为,1010000000...反正低位有很多0.
c在内存中存储但是如果输出a,但由于a为int型,所以只读取低位,所以a得到的是0值。

这个程序,主要弄得联合体的基本概念就够了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 08:07:47 | 显示全部楼层
4.png 1.定义后赋值前: 0.png



2.执行:un.a = 2;后      1.png

3.执行:un.a = 3;后      2.png

4.执行:un.c = 5.0;后 3.png

都到这份上了,不用我再说了吧,下次记得调试,会看出来很多。
加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 08:10:19 | 显示全部楼层
在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。

接着un.c=5.0;把c定义为5.0,此时,c为double型,此时c已经覆盖a,就是a已经不存在了。
一般在内存中数值都会被存储为二进制,所以double型被存储为,1010000000...反正低位有很多0.
c在内存中存储但是如果输出a,但由于a为int型,所以只读取低位,所以a得到的是0值。

这些不是我说的,我帮你摘取一部分看看,刚开始细节问题很难把握,用到了一切都顺理成章了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-9 21:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表