马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
为什么这个打印出来的b是124呢、#include <stdio.h>
#include <math.h>
int main()
{
int a = 5;
int b = pow(a,3);
printf("%d",b);
return 0;
}
而 这样就是正确的125了#include <stdio.h>
#include <math.h>
int main()
{
// int a = 5;
int b = pow(5,3);
printf("%d",b);
return 0;
}
搞不明白,,,求解答
本帖最后由 rencaixiaomeng 于 2018-12-21 15:24 编辑
[b]下面是 int b = pow(a,3);的反汇编代码
003117C5 83 EC 08 sub esp,8
003117C8 F2 0F 10 05 38 6B 31 00 movsd xmm0,mmword ptr [__real@4008000000000000 (0316B38h)]
003117D0 F2 0F 11 04 24 movsd mmword ptr [esp],xmm0
003117D5 F2 0F 2A 45 F8 cvtsi2sd xmm0,dword ptr [a]
003117DA 83 EC 08 sub esp,8
003117DD F2 0F 11 04 24 movsd mmword ptr [esp],xmm0
003117E2 E8 40 F9 FF FF call _pow (0311127h)
003117E7 83 C4 10 add esp,10h
003117EA E8 F2 F8 FF FF call __ftol2_sse (03110E1h)
003117EF 89 45 EC mov dword ptr [b],eax
下面是 int b = pow(5,3);的反汇编代码
00B817C5 83 EC 08 sub esp,8
00B817C8 F2 0F 10 05 38 6B B8 00 movsd xmm0,mmword ptr [__real@4008000000000000 (0B86B38h)]
00B817D0 F2 0F 11 04 24 movsd mmword ptr [esp],xmm0
00B817D5 83 EC 08 sub esp,8
00B817D8 F2 0F 10 05 48 6B B8 00 movsd xmm0,mmword ptr [__real@4014000000000000 (0B86B48h)]
00B817E0 F2 0F 11 04 24 movsd mmword ptr [esp],xmm0
00B817E5 E8 3D F9 FF FF call _pow (0B81127h)
00B817EA 83 C4 10 add esp,10h
00B817ED E8 EF F8 FF FF call __ftol2_sse (0B810E1h)
00B817F2 89 45 EC mov dword ptr ,eax
看不懂没关系,这些指令有一条是关键, int b = pow(a,3);的反汇编代码 第4条是 cvtsi2sd,这个指令的作用就是把整数转换成双精度浮点数,而在下面int b = pow(5,3);的反汇编代码则没有这条指令
因为int b = pow(5,3),5和3都是常量,在编译的时候,编译器知道pow接受的是double,就把5和3直接转成double型,这样在运行时就不用再转换类型
而 int b = pow(a,3) 因为a是变量,编译器不知道变量里面具体数值,就让程序运行时自己计算类型转换的值而可能出现这个误差
不过现在的编译器应该很少会出现这种情况,我用VS2015输出都正确
|