[問題] 關於 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