【问题标题】:Why does printf implicit float to int conversion not work?为什么 printf 隐式浮点到 int 转换不起作用?
【发布时间】:2011-12-19 09:18:50
【问题描述】:

请帮助我理解以下 C 输出:

#include<stdio.h>
int main() {
    float x = 4.0;
    printf("%f\n",x);
    printf("%d\n",x);
    int y=x;
    printf("%d\n",y);
    return 0;
}

gcc 编译器的输出

4.000000
0
4

据我所知,当我们将 float 分配给 int 变量时,变量的小数部分终止,然后分配给 int。

为什么在这种情况下没有发生?

【问题讨论】:

  • 你的意思是在最后一个打印语句中输出x
  • 最后printf 再次打印x,而不是y
  • thnx all...我问了一个愚蠢的问题...代码中有一个错误...我打算在最后一个语句中打印 y

标签: c printf


【解决方案1】:

您不是在打印y,而是在再次打印x

附带说明,printf 无法进行转换。因此,在预期 %d 时传递浮点数是未定义的行为。

【讨论】:

    【解决方案2】:

    据我所知,当我们将 float 分配给 int 变量时 变量的小数部分终止,然后分配给 诠释。

    声明是正确的,但要进行此转换,您必须cast 要转换的变量,而不仅仅是将其分配给另一个 int 变量。

    这也会在 printf 语句中引起问题,因为您正在打印一个带有 int 说明符 %d 且没有强制转换的浮点变量。

    修改你的代码如下:

    printf("%d\n", (int) x);
                     ^
                     | this is the cast operation
    

    它会为变量x正确打印整数值4

    【讨论】:

      【解决方案3】:

      floats 在作为... 参数传递时自动提升为doubles(类似于charsshort ints 提升为ints 的方式)。当printf() 查看格式说明符(%d%f 或其他)时,它会根据格式说明符(如intdouble 或其他)抓取并解释它收到的原始数据,然后打印出来。

      printf("%d\n",x) 是错误的,因为您将double 传递给printf(),但谎称它将是intprintf() 让你为谎言付出代价。它从其参数中获取 4 个字节(最有可能,但不一定是 4 个字节),即int 的大小,它从您之前放置 8 个字节的位置获取那些字节(同样,最有可能,但不一定是 8 个字节) double 4.0 的字节),其中这 4 个字节恰好全为零,然后它将它们解释为整数并打印出来。实际上,IEEE-754 双精度格式中 2 的幂通常有 52 个零位,或多于 6 个 8 位字节为零。

      那些“最有可能,但不一定”的词意味着 C 标准没有规定类型的固定大小和范围,并且它们可能因编译器、操作系统而异。如今,4 字节 ints 和 8 字节 doubles 是最常见的(如果我们考虑,例如 x86 平台)。

      【讨论】:

      • 你能告诉我强制转换和转换的区别吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多