关于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