看板 C_and_CPP 關於我們 聯絡資訊
https://i.imgur.com/Qmnd7YW.jpg
上圖是我的測試,上網查過資料後,我的認知是編譯器在即將把float格式輸出前,會先 轉成double的格式,而%d會取低32bit的值轉10進制再拿去輸出,我把我的輸出值0.5手 動轉成double後,發現取低32bit的輸出應是0才對,但是結果如圖卻不是,所以想請教 各位是我哪裡理解錯了嗎? 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 124.9.128.30 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1561603774.A.126.html
LPH66: 我猜它拿到垃圾值了 06/27 11:25
LPH66: 我是指 printf; 不過為什麼會有垃圾值一下子想不到可能原因 06/27 11:26
djshen: %d不是int? 06/27 11:59
james732: 我在MSVC是得到0,但gcc每次結果都不同 XD 06/27 12:12
james732: https://i.imgur.com/3FwFQ4A.png 06/27 12:14
james732: https://i.imgur.com/wPx5YdM.png 06/27 12:14
Fenikso: 因為x64的parameter是先放進register不是stack 06/27 12:36
LPH66: vararg 也會進 reg 嗎? 06/27 12:37
LPH66: 查了一下資料, 看起來原因應該是浮點數是放在浮點數暫存器 06/27 12:46
LPH66: 但 %d 要抓整數所以 printf 嘗試從整數暫存器找資料 06/27 12:46
LPH66: 就找到垃圾值了 06/27 12:47
LPH66: 然後就找到的東西看起來 vararg 的呼叫端處理沒什麼不同 06/27 12:47
LPH66: 所以該 (照 ABI) 進暫存器的就會進去的樣子 06/27 12:48
LPH66: 至於 MSVC 都會是 0 就不確定是不是編譯選項的問題了... 06/27 12:49
djshen: 我看C11 7.16.1.1 va_arg 會有UB的情況? 06/27 13:30
ac01965159: 謝謝各位前輩的回答,還是新手需要再好好消化一下。 06/27 14:28
chuegou: 推個 06/27 19:23
TitanEric: 寫不到學問這麼多 推 06/28 11:27
LPH66: printf 用錯的格式印值是 UB 沒錯啊 06/28 11:35
LPH66: 原 PO 是在問為何這個環境上的行為會是這樣 06/28 11:36
djshen: 補個連結 https://reurl.cc/VxYX6 06/28 21:41
djshen: 3.5.7的例子就可以看出參數怎麼放 06/28 21:42
firejox: https://godbolt.org/z/BxpmFJ 06/30 00:10