[問題] 關於 C 的 union

看板C_and_CPP作者 (藍藍欠)時間5年前 (2018/08/03 11:37), 編輯推噓10(10021)
留言31則, 11人參與, 5年前最新討論串1/1
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

08/03 11:40, 5年前 , 1F
是個自信滿滿的孩子呢(抱
08/03 11:40, 1F

08/03 11:44, 5年前 , 2F
浮點數和整數儲存格式不一樣
08/03 11:44, 2F

08/03 11:49, 5年前 , 3F
那假設 union 內是個 char 和 int呢?
08/03 11:49, 3F

08/03 11:49, 5年前 , 4F
data.a = 'x'; printf("%d\n",data.b); 也是完全不
08/03 11:49, 4F

08/03 11:50, 5年前 , 5F
如預期
08/03 11:50, 5F

08/03 11:52, 5年前 , 6F
你的預期是啥XD
08/03 11:52, 6F

08/03 12:01, 5年前 , 7F
我覺得每個寫C/C++的應該要把IEEE754列為必修....
08/03 12:01, 7F

08/03 12:02, 5年前 , 8F
IEEE754看一次可以搞懂很多問題
08/03 12:02, 8F

08/03 12:23, 5年前 , 9F
我的預期是 data.b = 120.....
08/03 12:23, 9F

08/03 12:29, 5年前 , 10F
計概老師常常請假嗎
08/03 12:29, 10F

08/03 13:04, 5年前 , 11F
不是120可能是你的char只用到1byte,其他memory是非0,
08/03 13:04, 11F

08/03 13:05, 5年前 , 12F
你可以把union Data data;換成global variable看看
08/03 13:05, 12F

08/03 13:21, 5年前 , 13F
boss ,你的建議非常有用。是不是他宣告為 global
08/03 13:21, 13F

08/03 13:21, 5年前 , 14F
就是在 .bss 區塊,系統會自動初始為0
08/03 13:21, 14F

08/03 13:33, 5年前 , 15F
同頁23148那篇有你要的答案 建議看看
08/03 13:33, 15F

08/03 13:35, 5年前 , 16F
還是不懂請google IEEE754跟little endian XD
08/03 13:35, 16F

08/03 15:27, 5年前 , 17F
是的,bss sec要初始成0
08/03 15:27, 17F

08/03 15:58, 5年前 , 18F
謝了..我聽了各位大大的建議去讀了IEEE754都懂了
08/03 15:58, 18F

08/03 16:19, 5年前 , 19F
回到原問題 b=0x0A,用double(8byte)去表示,IEEE
08/03 16:19, 19F

08/03 16:20, 5年前 , 20F
轉換後,用格式化輸出 %f 為 0.000000
08/03 16:20, 20F

08/03 18:48, 5年前 , 21F
你要不要自己算算看那個數有多小
08/03 18:48, 21F

08/03 20:49, 5年前 , 22F
5e-323
08/03 20:49, 22F

08/03 21:04, 5年前 , 23F
讀懂ieee745啊 厲害
08/03 21:04, 23F

08/06 12:02, 5年前 , 24F
那東西很難懂嗎 = = 不就解釋FLOAT怎麼表示而已
08/06 12:02, 24F

08/06 12:03, 5年前 , 25F
到是上面有人提到重點 他還有little endian的問題
08/06 12:03, 25F

08/07 17:19, 5年前 , 26F
那如果兩個變數都是 int 呢
08/07 17:19, 26F

08/07 17:22, 5年前 , 27F
剛剛試了一下,就沒問題了呢
08/07 17:22, 27F

08/07 21:46, 5年前 , 28F
兩個都int那union的意義在哪
08/07 21:46, 28F

08/08 12:43, 5年前 , 29F
你可以得到一個真正的別名 而不是像reference一樣的假
08/08 12:43, 29F

08/08 12:45, 5年前 , 30F
別名真指標 不但省了記憶體空間 而且不用& 抽象更好理
08/08 12:45, 30F

08/08 12:46, 5年前 , 31F
解 以上都是我唬爛的 不要當真(逃)
08/08 12:46, 31F
文章代碼(AID): #1ROytVL4 (C_and_CPP)