c - 使用 %d 打印一个 float

标签 c printf

我在 printf 中故意错误地编写了这个程序

#include <stdio.h>

int main()
{
        double foo = 2.54f;
        printf("-> %d\n", foo);
}

运行几次后输出:

-> 1180400440

->1754655672

->1596232744

-> -905631720

-> 202675976

-> -1580281720

-> 1020283160

-> 929827960

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

最佳答案

因为在您的平台上,doubleint 传递给函数的方式不同。通常,double 在浮点寄存器中传递,而 int 在通用寄存器中传递。 (当然有一定的限制;最终你会用完寄存器,如果参数太多,剩余的参数将在堆栈上传递。)

当您告诉 printf 期待一个 int 时,它会在它希望找到 int 的地方寻找 int >s。但是那个 GPR 没有被设置为任何特定的值,因为当你调用 printf 时,你用一个 double 调用它,它被放入一个浮点寄存器。

你真的不需要知道,尽管它可能很有趣。对 printf 谎报您提供的参数类型实际上是未定义行为 (UB),大多数编译器会就此警告您(至少如果您提供 -Wall 命令行选项或等效项)。 UB 意味着任何事情都可能发生,例如,程序提前终止或使用完全随机的数据。所以一定要让编译器给你警告,并确保你修复它们。

关于c - 使用 %d 打印一个 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22545360/

相关文章:

c - 如何在 C 中绘制 Unicode 刻度线?

java - 在 printin 处输入 int

c - 将整个数组作为参数传递给函数

c - 64 位移位的错误答案

受控无限循环使用过多资源

c - C 中的链表程序错误

c - 使用gdb逐步检查sprintf()函数

c++ - fprintf 不能在 C++ 中使用 switch/case 语句

python - 为什么在 Python 中执行时不能将 printf 与 sqlite 一起使用

c - 如何避免在 makefile 中手动列出来自不同路径的每个 C 文件?