我在 printf
中故意错误地编写了这个程序
#include <stdio.h>
int main()
{
double foo = 2.54f;
printf("-> %d\n", foo);
}
运行几次后输出:
-> 1180400440
->1754655672
->1596232744
-> -905631720
-> 202675976
-> -1580281720
-> 1020283160
-> 929827960
我的问题是,为什么每次运行程序时输出的数字都不一样?
最佳答案
因为在您的平台上,double
和 int
传递给函数的方式不同。通常,double
在浮点寄存器中传递,而 int
在通用寄存器中传递。 (当然有一定的限制;最终你会用完寄存器,如果参数太多,剩余的参数将在堆栈上传递。)
当您告诉 printf
期待一个 int
时,它会在它希望找到 int
的地方寻找 int
>s。但是那个 GPR 没有被设置为任何特定的值,因为当你调用 printf
时,你用一个 double
调用它,它被放入一个浮点寄存器。
你真的不需要知道,尽管它可能很有趣。对 printf
谎报您提供的参数类型实际上是未定义行为 (UB),大多数编译器会就此警告您(至少如果您提供 -Wall
命令行选项或等效项)。 UB 意味着任何事情都可能发生,例如,程序提前终止或使用完全随机的数据。所以一定要让编译器给你警告,并确保你修复它们。
关于c - 使用 %d 打印一个 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22545360/