返回信息流非常困惑,为什么两次输出不一样?
#include <iostream>
using namespace std;
int main (void)
{
float b = 1;
printf("%x\n", b);
printf("%x\n", b);
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #78626同步于 2014/4/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
printf问题
yondchang
2014/4/23镜像同步23 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
你跑出来的值什么?或者把汇编代码以及测试环境版本信息发上来大家讨论下。
我的理解是%x输出无符号32位整数,x是float,提升成double后入栈,printf只取低4字节输出,那就是0.
【 在 yondchang 的大作中提到: 】
: 我在xcode以及g++跑出来都不一样啊
: 来自「北邮人论坛手机版」
把float换城double不影响结果
我的程序输出是:
5fbff8d0
100
如果接着输出就是200,300,400...
mac 下 XCODE 或者直接 g++ 编译
1. g++编译报错,可能是我x86_64版本的问题,加上stdio.h就好了= =很久没用过C++了……
test.c: In function ‘int main()’:
test.c:8:29: error: ‘printf’ was not declared in this scope
2. 贴一下x86_64版本的汇编,rdi是第一个参数没错,但是第二个参数应该是放到rsi里的……没找到??!不知道是不是XMM reg搞得鬼。
0x000000000040071c <+0>: push %rbp
0x000000000040071d <+1>: mov %rsp,%rbp
0x0000000000400720 <+4>: sub $0x10,%rsp
0x0000000000400724 <+8>: mov 0x146(%rip),%eax # 0x400870
0x000000000040072a <+14>: mov %eax,-0x4(%rbp)
0x000000000040072d <+17>: movss -0x4(%rbp),%xmm0
0x0000000000400732 <+22>: cvtps2pd%xmm0,%xmm0
0x0000000000400735 <+25>: mov $0x40086c,%edi
0x000000000040073a <+30>: mov $0x1,%eax
0x000000000040073f <+35>: callq 0x4005c0 <printf@plt>
0x0000000000400744 <+40>: movss -0x4(%rbp),%xmm0
0x0000000000400749 <+45>: cvtps2pd %xmm0,%xmm0
0x000000000040074c <+48>: mov $0x40086c,%edi
0x0000000000400751 <+53>: mov $0x1,%eax
0x0000000000400756 <+58>: callq 0x4005c0 <printf@plt>
0x000000000040075b <+63>: mov $0x0,%eax
0x0000000000400760 <+68>: leaveq
0x0000000000400761 <+69>: retq
【 在 yondchang 的大作中提到: 】
: 非常困惑,为什么两次输出不一样?
: #include <iostream>
: using namespace std;
: ...................