C_and_CPP 板


LINE

※ 引述《ac01965159 (leeleo)》之銘言: : 標題: 關於c++的輸出問題 : 時間: Thu Jun 27 10:49:32 2019 : : https://i.imgur.com/Qmnd7YW.jpg : 上圖是我的測試,上網查過資料後,我的認知是編譯器在即將把float格式輸出前,會先 : 轉成double的格式,而%d會取低32bit的值轉10進制再拿去輸出,我把我的輸出值0.5手 : 動轉成double後,發現取低32bit的輸出應是0才對,但是結果如圖卻不是,所以想請教 : 各位是我哪裡理解錯了嗎? : 謝謝。 : : : -- :



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 124.9.128.30 (臺灣)
: ※ 文章網址: https://webptt.com/m.aspx?n=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 MSVC的情況 https://godbolt.org/z/CkJrN7 從asm的結果來看 float 0x3FFFFFFF 會先轉成 double 0x3FFFFFFF E0000000 到asm line 10的時候 stack應該會長這樣 __________ addr+0 push %ebp (line 31) __________ addr-4 push %ecx (line 33) __________ addr-8 a.y converted to double addr-12 (line 37) __________ addr-16 push 1 (line 38) __________ addr-20 push %ebp (line 5) __________ addr-24 <- %ebp addr-12 這裡大概是因為實際存到 stack 的是 一個 double 和一個 int 造成參數開始的位置算錯 __________ addr-28 __________ addr-32 <- %esp 接著 line 14 從 -4(addr-12) 讀一個 32-bit integer little endian 所以會讀到 0xE0000000 float 0.5 會轉成 double 0x3FE00000 00000000 剛好最後會讀到 0 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.226.15.37 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1561736243.A.C6D.html
1F:推 LPH66: 問題就在於 amd64 ABI 會要求一些能放暫存器的參數要放過去 06/29 00:18
2F:→ LPH66: 這裡只有一個指標和一個浮點數, 應該是夠用的 06/29 00:18
3F:→ LPH66: 但 MSVC 不知為什麼依然全部丟堆疊 06/29 00:18
4F:→ LPH66: 我是猜測不知道哪裡的設定不一樣使得 MSVC 做這樣設定 06/29 00:20
5F:→ LPH66: 話說剛剛突然想到一個可能原因: 或許 MSVC 的預設設定是 06/29 00:22
6F:→ LPH66: 編出 32-bit 程式, 所以才是使用堆疊 06/29 00:23
7F:→ djshen: 看起來應該是這樣 compiler改成x64 msvc就會用register了 06/29 00:36
8F:推 wei115: 話說在msys2上的gcc跑也會是0,用-m64(-m32錯誤) 06/29 02:12
9F:→ wei115: 照上面的思路,gcc應該也是把東西都堆疊(就算x64) 06/29 02:13
10F:→ wei115: 那gcc為什麼沒把東西都register? 06/29 02:13
11F:→ wei115: 都->丟 06/29 02:15
12F:推 ac01965159: 感謝大大的解惑。 07/01 14:52







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP