作者blueblueChen (蓝蓝欠)
看板C_and_CPP
标题[问题] 关於 C 的 union
时间Fri Aug 3 11:37:00 2018
union Data {
int b;
double c;
};
union Data data;
data.b = 10;
printf("%f\n",data.c);
看完了别人的部落格,觉得自信满满懂了 union
自己测试後,跟预期的答案不一样...自己还是完全不懂
我预期是 10.000000
b c共用记忆体,操作 data.b = 10 後,data.c 完全可以存下10,显示出来应该是
10.000000阿...
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.220.69.181
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1533267423.A.544.html
1F:推 Hazukashiine: 是个自信满满的孩子呢(抱 08/03 11:40
2F:推 jerryh001: 浮点数和整数储存格式不一样 08/03 11:44
3F:→ blueblueChen: 那假设 union 内是个 char 和 int呢? 08/03 11:49
4F:→ blueblueChen: data.a = 'x'; printf("%d\n",data.b); 也是完全不 08/03 11:49
5F:→ blueblueChen: 如预期 08/03 11:50
6F:→ sarafciel: 你的预期是啥XD 08/03 11:52
7F:推 Killercat: 我觉得每个写C/C++的应该要把IEEE754列为必修.... 08/03 12:01
8F:→ Killercat: IEEE754看一次可以搞懂很多问题 08/03 12:02
9F:→ blueblueChen: 我的预期是 data.b = 120..... 08/03 12:23
10F:推 stupid0319: 计概老师常常请假吗 08/03 12:29
11F:推 boss0405: 不是120可能是你的char只用到1byte,其他memory是非0, 08/03 13:04
12F:→ boss0405: 你可以把union Data data;换成global variable看看 08/03 13:05
13F:→ blueblueChen: boss ,你的建议非常有用。是不是他宣告为 global 08/03 13:21
14F:→ blueblueChen: 就是在 .bss 区块,系统会自动初始为0 08/03 13:21
15F:→ sarafciel: 同页23148那篇有你要的答案 建议看看 08/03 13:33
16F:→ sarafciel: 还是不懂请google IEEE754跟little endian XD 08/03 13:35
17F:推 boss0405: 是的,bss sec要初始成0 08/03 15:27
18F:→ blueblueChen: 谢了..我听了各位大大的建议去读了IEEE754都懂了 08/03 15:58
19F:→ blueblueChen: 回到原问题 b=0x0A,用double(8byte)去表示,IEEE 08/03 16:19
20F:→ blueblueChen: 转换後,用格式化输出 %f 为 0.000000 08/03 16:20
21F:→ djshen: 你要不要自己算算看那个数有多小 08/03 18:48
22F:推 cutekid: 5e-323 08/03 20:49
23F:推 remember: 读懂ieee745啊 厉害 08/03 21:04
24F:→ Killercat: 那东西很难懂吗 = = 不就解释FLOAT怎麽表示而已 08/06 12:02
25F:→ Killercat: 到是上面有人提到重点 他还有little endian的问题 08/06 12:03
26F:推 alan23273850: 那如果两个变数都是 int 呢 08/07 17:19
27F:→ alan23273850: 刚刚试了一下,就没问题了呢 08/07 17:22
28F:推 jerryh001: 两个都int那union的意义在哪 08/07 21:46
29F:→ sarafciel: 你可以得到一个真正的别名 而不是像reference一样的假 08/08 12:43
30F:→ sarafciel: 别名真指标 不但省了记忆体空间 而且不用& 抽象更好理 08/08 12:45
31F:→ sarafciel: 解 以上都是我唬烂的 不要当真(逃) 08/08 12:46