看板 C_and_CPP 關於我們 聯絡資訊
原文刪 =============================== 你的printf("%d",*a); 是UB,再怎麼樣也不會有正確的結果,不用糾結為何是1 想要取0x200000001的值也不應該用double接 把你的程式改一下 ------------------------- union ud{ int i[2]; double d; } d; d.i[0] = 1; d.i[1] = 2; ------------------------- d的值為 http://imgur.com/0Ci2C3m 因x86 的little endian展開 16進位為 00000001 00000002 轉換成2進位 http://imgur.com/lJsWpgq 但你用double接會變成 16進位 00000002 00000001 依 IEEE 754-1985 double 定義全展開 0 00000000000 0000000000000000001000000000000000000000000000000001 即使你轉型long long 值依然是0 正確要用long long 接 long long *ud = (long long *)&d; printf("dec:%lld hex:%#llx", *ud, *ud); output: dec:8589934593 hex:0x200000001 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.143.169 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1503979540.A.8F5.html ※ 編輯: enonrick (125.227.143.169), 08/29/2017 12:14:00
usanhuang: 謝謝大大的解說 這個地方真的是很難注意 08/29 21:11