看板 C_and_CPP 關於我們 聯絡資訊
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://www.ptt.cc/bbs/C_and_CPP/M.1533267423.A.544.html
Hazukashiine: 是個自信滿滿的孩子呢(抱 08/03 11:40
jerryh001: 浮點數和整數儲存格式不一樣 08/03 11:44
blueblueChen: 那假設 union 內是個 char 和 int呢? 08/03 11:49
blueblueChen: data.a = 'x'; printf("%d\n",data.b); 也是完全不 08/03 11:49
blueblueChen: 如預期 08/03 11:50
sarafciel: 你的預期是啥XD 08/03 11:52
Killercat: 我覺得每個寫C/C++的應該要把IEEE754列為必修.... 08/03 12:01
Killercat: IEEE754看一次可以搞懂很多問題 08/03 12:02
blueblueChen: 我的預期是 data.b = 120..... 08/03 12:23
stupid0319: 計概老師常常請假嗎 08/03 12:29
boss0405: 不是120可能是你的char只用到1byte,其他memory是非0, 08/03 13:04
boss0405: 你可以把union Data data;換成global variable看看 08/03 13:05
blueblueChen: boss ,你的建議非常有用。是不是他宣告為 global 08/03 13:21
blueblueChen: 就是在 .bss 區塊,系統會自動初始為0 08/03 13:21
sarafciel: 同頁23148那篇有你要的答案 建議看看 08/03 13:33
sarafciel: 還是不懂請google IEEE754跟little endian XD 08/03 13:35
boss0405: 是的,bss sec要初始成0 08/03 15:27
blueblueChen: 謝了..我聽了各位大大的建議去讀了IEEE754都懂了 08/03 15:58
blueblueChen: 回到原問題 b=0x0A,用double(8byte)去表示,IEEE 08/03 16:19
blueblueChen: 轉換後,用格式化輸出 %f 為 0.000000 08/03 16:20
djshen: 你要不要自己算算看那個數有多小 08/03 18:48
cutekid: 5e-323 08/03 20:49
remember: 讀懂ieee745啊 厲害 08/03 21:04
Killercat: 那東西很難懂嗎 = = 不就解釋FLOAT怎麼表示而已 08/06 12:02
Killercat: 到是上面有人提到重點 他還有little endian的問題 08/06 12:03
alan23273850: 那如果兩個變數都是 int 呢 08/07 17:19
alan23273850: 剛剛試了一下,就沒問題了呢 08/07 17:22
jerryh001: 兩個都int那union的意義在哪 08/07 21:46
sarafciel: 你可以得到一個真正的別名 而不是像reference一樣的假 08/08 12:43
sarafciel: 別名真指標 不但省了記憶體空間 而且不用& 抽象更好理 08/08 12:45
sarafciel: 解 以上都是我唬爛的 不要當真(逃) 08/08 12:46