【问题标题】:In C, using %f in printf() to print an integer outputs 0.00000 , why? [duplicate]在 C 中,使用 printf() 中的 %f 打印整数输出 0.00000 ,为什么? [复制]
【发布时间】:2021-08-12 22:43:39
【问题描述】:

【问题讨论】:

标签: c++ c memory types printf


【解决方案1】:

现在许多架构/操作系统/ABI 的参数传递约定都是基于寄存器的,至少对于前几个参数。大多数架构上的整数和浮点使用完全独立的寄存器。当您告诉它打印%f 时,它会在浮点寄存器中查找,但作为int 的参数是在整数寄存器中传递的;他们根本看不到对方,所以你甚至不会得到“半垃圾”(其中一些是被解释为浮点的整数位),它是“完全垃圾”(你看到任何发生的事情都被抛在后面上次使用时在该寄存器中)。

在你的情况下它是0.0,但它可能在下一次运行时有所不同,或者由不同的编译器构建,或者受月相的影响等。这是未定义的行为,所以 C/C++ 规范不不必费心得到比这更详细的了。

【讨论】:

  • 这实际上是一个非常好的答案 - 它超越了未定义的行为并解释了观察到的结果。
【解决方案2】:

首先,您的假设通常是不正确的。整数和浮点数在作为参数传递给可变参数函数时都会被提升,因此假设现在最常见的架构,它们的大小都会变成 8 字节。

话虽如此,这段代码会触发未定义的行为,因为您正试图将浮点数的二进制表示视为整数。未定义的行为可能会产生看似随机的观察效果,​​在您的情况下,打印的是 0 - 但从语言的角度来看,它是完全随机的。

【讨论】:

  • 这里的“随机”是指“任意的、巧合的、不可靠的和偶然的”,而不是“这是一种获得随机数的聪明有用的方法”。
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 2015-05-02
  • 2022-11-27
相关资源
最近更新 更多