關於c++的輸出問題

看板C_and_CPP (C/C++)作者 (leeleo)時間6年前 (2019/06/27 10:49), 編輯推噓6(6017)
留言23則, 8人參與, 6年前最新討論串1/2 (看更多)
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

06/27 11:25, 6年前 , 1F
我猜它拿到垃圾值了
06/27 11:25, 1F

06/27 11:26, 6年前 , 2F
我是指 printf; 不過為什麼會有垃圾值一下子想不到可能原因
06/27 11:26, 2F

06/27 11:59, 6年前 , 3F
%d不是int?
06/27 11:59, 3F

06/27 12:12, 6年前 , 4F
我在MSVC是得到0,但gcc每次結果都不同 XD
06/27 12:12, 4F

06/27 12:14, 6年前 , 5F

06/27 12:14, 6年前 , 6F

06/27 12:36, 6年前 , 7F
因為x64的parameter是先放進register不是stack
06/27 12:36, 7F

06/27 12:37, 6年前 , 8F
vararg 也會進 reg 嗎?
06/27 12:37, 8F

06/27 12:46, 6年前 , 9F
查了一下資料, 看起來原因應該是浮點數是放在浮點數暫存器
06/27 12:46, 9F

06/27 12:46, 6年前 , 10F
但 %d 要抓整數所以 printf 嘗試從整數暫存器找資料
06/27 12:46, 10F

06/27 12:47, 6年前 , 11F
就找到垃圾值了
06/27 12:47, 11F

06/27 12:47, 6年前 , 12F
然後就找到的東西看起來 vararg 的呼叫端處理沒什麼不同
06/27 12:47, 12F

06/27 12:48, 6年前 , 13F
所以該 (照 ABI) 進暫存器的就會進去的樣子
06/27 12:48, 13F

06/27 12:49, 6年前 , 14F
至於 MSVC 都會是 0 就不確定是不是編譯選項的問題了...
06/27 12:49, 14F

06/27 13:30, 6年前 , 15F
我看C11 7.16.1.1 va_arg 會有UB的情況?
06/27 13:30, 15F

06/27 14:28, 6年前 , 16F
謝謝各位前輩的回答,還是新手需要再好好消化一下。
06/27 14:28, 16F

06/27 19:23, 6年前 , 17F
推個
06/27 19:23, 17F

06/28 11:27, 6年前 , 18F
寫不到學問這麼多 推
06/28 11:27, 18F

06/28 11:35, 6年前 , 19F
printf 用錯的格式印值是 UB 沒錯啊
06/28 11:35, 19F

06/28 11:36, 6年前 , 20F
原 PO 是在問為何這個環境上的行為會是這樣
06/28 11:36, 20F

06/28 21:41, 6年前 , 21F
06/28 21:41, 21F

06/28 21:42, 6年前 , 22F
3.5.7的例子就可以看出參數怎麼放
06/28 21:42, 22F

06/30 00:10, 6年前 , 23F
文章代碼(AID): #1T52w-4c (C_and_CPP)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 2 篇):
文章代碼(AID): #1T52w-4c (C_and_CPP)