關於c++的輸出問題

作者: ac01965159 (leeleo)   2019-06-27 10:49:32
https://i.imgur.com/Qmnd7YW.jpg
上圖是我的測試,上網查過資料後,我的認知是編譯器在即將把float格式輸出前,會先
轉成double的格式,而%d會取低32bit的值轉10進制再拿去輸出,我把我的輸出值0.5手
動轉成double後,發現取低32bit的輸出應是0才對,但是結果如圖卻不是,所以想請教
各位是我哪裡理解錯了嗎?
謝謝。
作者: LPH66 (-6.2598534e+18f)   2019-06-27 11:25:00
我猜它拿到垃圾值了我是指 printf; 不過為什麼會有垃圾值一下子想不到可能原因
作者: djshen (djshen)   2019-06-27 11:59:00
%d不是int?
作者: james732 (好人超)   2019-06-27 12:12:00
我在MSVC是得到0,但gcc每次結果都不同 XDhttps://i.imgur.com/3FwFQ4A.pnghttps://i.imgur.com/wPx5YdM.png
作者: Fenikso (薪水小偷)   2019-06-27 12:36:00
因為x64的parameter是先放進register不是stack
作者: LPH66 (-6.2598534e+18f)   2019-06-27 12:37:00
vararg 也會進 reg 嗎?查了一下資料, 看起來原因應該是浮點數是放在浮點數暫存器但 %d 要抓整數所以 printf 嘗試從整數暫存器找資料就找到垃圾值了然後就找到的東西看起來 vararg 的呼叫端處理沒什麼不同所以該 (照 ABI) 進暫存器的就會進去的樣子至於 MSVC 都會是 0 就不確定是不是編譯選項的問題了...
作者: djshen (djshen)   2019-06-27 13:30:00
我看C11 7.16.1.1 va_arg 會有UB的情況?
作者: ac01965159 (leeleo)   2019-06-27 14:28:00
謝謝各位前輩的回答,還是新手需要再好好消化一下。
作者: chuegou (chuegou)   2019-06-27 19:23:00
推個
作者: TitanEric (泰坦)   2019-06-28 11:27:00
寫不到學問這麼多 推
作者: LPH66 (-6.2598534e+18f)   2019-06-28 11:35:00
printf 用錯的格式印值是 UB 沒錯啊原 PO 是在問為何這個環境上的行為會是這樣
作者: djshen (djshen)   2019-06-28 21:41:00
補個連結 https://reurl.cc/VxYX63.5.7的例子就可以看出參數怎麼放
作者: firejox (Tangent)   2019-06-30 00:10:00

Links booklink

Contact Us: admin [ a t ] ucptt.com