如果我们查看编译器生成的代码,我们会看到以下内容:
00401B5E|>MOV DWORD PTR SS:[ESP+0x4],0x62 ; |||
00401B66|>MOV DWORD PTR SS:[ESP],arma_sto.00404024 ; |||ASCII "line 5: %f\n"
00401B6D|>CALL <JMP.&msvcrt.printf> ; ||\printf
00401B72|>MOV DWORD PTR SS:[ESP+0x4],0x51EB851F ; ||
00401B7A|>MOV DWORD PTR SS:[ESP+0x8],0x4058BEB8 ; ||
00401B82|>MOV DWORD PTR SS:[ESP],arma_sto.00404030 ; ||ASCII "line 6: %f\n"
00401B89|>CALL <JMP.&msvcrt.printf> ; |\printf
00401B8E|>MOV DWORD PTR SS:[ESP+0x4],0x62 ; |
00401B96|>MOV DWORD PTR SS:[ESP],arma_sto.00404024 ; |ASCII "line 5: %f\n"
00401B9D|>CALL <JMP.&msvcrt.printf> ; \printf
因为您没有将这两个 98 值转换为浮点数,所以输出是随机的(基于堆栈)。%f 的有效输入是一个浮点数,它在堆栈上占用两个条目。
第 4 行不起作用,因为您只提供了一个堆栈条目。
第 5 行工作正常,因为 98.98 是一个浮点数(需要两个堆栈条目)
第 6 行输出 ~98.98,因为 00401B7A 处的 MOV 没有撤消。这意味着第 6 行输出了一个有效的浮点数,因为它有两个堆栈条目,但由于前一个数字还剩下一部分,所以输出了错误的浮点数。
解决方案,转换为浮点数
printf("line 5: %f\n",(float)98); //output is 98.000000
printf("line 6: %f\n",98.98); //output is 98.980000
printf("line 5: %f\n",(float)98); //output is 98.000000