两种方式打印sqrt(10)结果不同?

为什么这两种方法打印的结果不一样?
#include
#include
int main()
{
int a = sqrt(10);
printf("%d\n",a );
printf("%d\n", sqrt(10));
return 0;
}

img

给你这个图看能不能理解?

img

整数用 %d 格式转换输出。32浮点数的存储有符号位。而且和整数的位数也不一样。占的字节也不一样。
通俗讲就像是你把64位的数据 放到只有32位的存储位上 ,那它肯定会丢掉另外32位

因为sqrt函数的返回值是double型的,你用%d形式接受,就会有问题,你可以printf("%d",(int)sqrt(10));进行强制类型转换,输出结果就和第一个一样了。也可以printf("%f",sqrt(10));这样更精确点。

x64调用规则规定,从左到右头4个参数,浮点类型参数是依次通过XMM0-XMM3寄存器传递,而整型参数是依次通过RCX, RDX, R8, R9传递,其余参数通过栈传递。
sqrt()函数返回值是double类型,因此调用printf("%d\n", sqrt(10));时,sqrt(10)的结果是在XMM1寄存器里。而但按%d整型输出时,取的值却是RDX里的值。

img

参考
https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^