以下代码都在linux 64位机下gcc编译
1.问题起因
之前在执行printf("%d\n", pow(2, 4))
这个语句的时候他每次的输出的都不一样但是都不是我想要的值16
;然后去网上查了一些资料说这么输出是0
;因为pow
函数的定义是
double pow(double a, double b)
所以会返回一个double
型的数据用printf以%d
打印只会取高位4
字节所以会是0
;正好当时在学习汇编所以就想看一下,为什么我打印出来不是0
;而是一些奇奇怪怪的东西每次都不一样;
#include <stdio.h>
#include <math.h>
int main()
{
printf("%d\n", pow(2, 4));
}
2.验证
我通过oujdump -S a.out
去查看我的汇编形式代码;
找到了main
函数的代码我发现了这样一句
movsd -0x8(%rbp),&xmm0
xmm0
是64位机下的一个128位的寄存器专门用来存放浮点数,所以我猜想,pow(2, 4)
的结果被存放到了这个寄存器中;然而printf("%d")
确从eax
这个寄存器中取值打印所以每次打印出来的不一样;
当然每次打印0
的小伙伴们也没有问题,因为所处的环境不同,所使用的编译器不同;