从汇编看pow函数直接用%d输出为什么会和预期不一样

以下代码都在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的小伙伴们也没有问题,因为所处的环境不同,所使用的编译器不同;

发布了35 篇原创文章 · 获赞 82 · 访问量 7542

猜你喜欢

转载自blog.csdn.net/qq_44049351/article/details/99709659