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/cn.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/cn.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灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP