为什么这两种方法打印的结果不一样?
#include
#include
int main()
{
int a = sqrt(10);
printf("%d\n",a );
printf("%d\n", sqrt(10));
return 0;
}
给你这个图看能不能理解?
整数用 %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里的值。
参考
https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170