使用%d打印浮点数

DSU*_*SUK 1 c printf

我用故意错误编写了这个程序 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

我的问题是,为什么每次运行程序时都会输出不同的数字?

ric*_*ici 5

因为在您的平台上,doubles和ints以不同方式传递给函数.通常,doubles在浮点寄存器int中传递,而s在通用寄存器中传递.(当然,达到某种限制;最终你会用完寄存器,如果参数太多,剩下的就会在堆栈上传递.)

当你告诉printf期望一个时int,它int会找到它希望找到int的位置.但是GPR没有被设置为任何特定的值,因为当你调用时printf,你用一个double放入浮点寄存器中调用它.

你真的不需要知道,虽然它可能很有趣.它实际上是未定义的行为(UB),printf关于你提供的参数的类型,大多数编译器会警告你(至少如果你提供-Wall命令行选项或等效).UB意味着可能发生任何事情,包括例如程序提前终止或使用完全随机数据.因此,请确保您要求编译器向您发出警告,并确保修复它们.

  • @MichaelWalz:是的,取决于对齐,填充和参数大小等细节.在这种情况下,假设一个`int`最多和`double`一样大是合理的,所以如果`double`不需要额外填充并且所有参数都被压入堆栈,那么你可能会得到一致的输出.但是,您应该*从不*编写一个假定特定类型的未定义行为的程序(除非您为编译器编写标准库,而该编译器的内部也是您可以控制的.) (2认同)