[问题] 关于 C 的 union

楼主: blueblueChen (蓝蓝欠)   2018-08-03 11:37:00
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阿...
谢谢
作者: Hazukashiine (私は幸せです)   2018-08-03 11:40:00
是个自信满满的孩子呢(抱
作者: jerryh001   2018-08-03 11:44:00
浮点数和整数储存格式不一样
楼主: blueblueChen (蓝蓝欠)   2018-08-03 11:49:00
那假设 union 内是个 char 和 int呢?data.a = 'x'; printf("%d\n",data.b); 也是完全不如预期
作者: sarafciel (Cattuz)   2018-08-03 11:52:00
你的预期是啥XD
作者: Killercat (杀人猫™)   2018-08-03 12:01:00
我觉得每个写C/C++的应该要把IEEE754列为必修....IEEE754看一次可以搞懂很多问题
楼主: blueblueChen (蓝蓝欠)   2018-08-03 12:23:00
我的预期是 data.b = 120.....
作者: stupid0319 (征女友)   2018-08-03 12:29:00
计概老师常常请假吗
作者: boss0405 (boss)   2018-08-03 13:04:00
不是120可能是你的char只用到1byte,其他memory是非0,你可以把union Data data;换成global variable看看
楼主: blueblueChen (蓝蓝欠)   2018-08-03 13:21:00
boss ,你的建议非常有用。是不是他宣告为 global就是在 .bss 区块,系统会自动初始为0
作者: sarafciel (Cattuz)   2018-08-03 13:33:00
同页23148那篇有你要的答案 建议看看还是不懂请google IEEE754跟little endian XD
作者: boss0405 (boss)   2018-08-03 15:27:00
是的,bss sec要初始成0
楼主: blueblueChen (蓝蓝欠)   2018-08-03 15:58:00
谢了..我听了各位大大的建议去读了IEEE754都懂了回到原问题 b=0x0A,用double(8byte)去表示,IEEE转换后,用格式化输出 %f 为 0.000000
作者: djshen (djshen)   2018-08-03 18:48:00
你要不要自己算算看那个数有多小
作者: cutekid (可爱小孩子)   2018-08-03 20:49:00
5e-323
作者: remember (人老也有天使收)   2018-08-03 21:04:00
读懂ieee745啊 厉害
作者: Killercat (杀人猫™)   2018-08-06 12:02:00
那东西很难懂吗 = = 不就解释FLOAT怎么表示而已到是上面有人提到重点 他还有little endian的问题
作者: alan23273850   2018-08-07 17:19:00
那如果两个变量都是 int 呢刚刚试了一下,就没问题了呢
作者: jerryh001   2018-08-07 21:46:00
两个都int那union的意义在哪
作者: sarafciel (Cattuz)   2018-08-08 12:43:00
你可以得到一个真正的别名 而不是像reference一样的假别名真指标 不但省了内存空间 而且不用& 抽象更好理解 以上都是我唬烂的 不要当真(逃)

Links booklink

Contact Us: admin [ a t ] ucptt.com