作者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/m.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