我用故意错误编写了这个程序 printf
#include <stdio.h>
int main()
{
double foo = 2.54f;
printf("-> %d\n", foo);
}
Run Code Online (Sandbox Code Playgroud)
运行几次之后输出:
- > 1180400440
- > 1754655672
- > 1596232744
- > -905631720
- > 202675976
- > -1580281720
- > 1020283160
- > 929827960
我的问题是,为什么每次运行程序时都会输出不同的数字?
因为在您的平台上,doubles和ints以不同方式传递给函数.通常,doubles在浮点寄存器int中传递,而s在通用寄存器中传递.(当然,达到某种限制;最终你会用完寄存器,如果参数太多,剩下的就会在堆栈上传递.)
当你告诉printf期望一个时int,它int会找到它希望找到int的位置.但是GPR没有被设置为任何特定的值,因为当你调用时printf,你用一个double放入浮点寄存器中调用它.
你真的不需要知道,虽然它可能很有趣.它实际上是未定义的行为(UB),printf关于你提供的参数的类型,大多数编译器会警告你(至少如果你提供-Wall命令行选项或等效).UB意味着可能发生任何事情,包括例如程序提前终止或使用完全随机数据.因此,请确保您要求编译器向您发出警告,并确保修复它们.