以float格式打印int变量

时间:2015-06-08 10:35:06

标签: c gcc printf

我使用gcc来编译它:

int a=1;
printf("%d\n",a);
printf("%f\n",a);
printf("%f\n",(float)a);

我明白了:

  

1
  0.000000
  1.000000

为什么隐式转换输出错误?

7 个答案:

答案 0 :(得分:3)

没有转换。 printf不是接受浮点数的函数。它是一个接受可以是任何类型的参数列表的函数。

编译器假定给出了一个浮点数,并且您看到基本上未定义的行为。

没有机制可以解析输入字符串,然后对每个参数应用自定义转换。你应该非常小心你传递给printf的东西,因为这样就可以打开漏洞。

答案 1 :(得分:2)

因为double%f期望的)可能大于您平台上的int。没有"隐式转换&#34 ;;它将传递int作为第二个参数,printf()将读取double

顺便说一下,这是不明确的行为,不要这样做。

答案 2 :(得分:2)

在您的代码中

int a=1;
//something
printf("%f\n",a);

没有隐式转换,而是格式说明符的不当使用,这会产生undefined behaviour

相关:C11标准,章节§7.21.6.1,fprintf()功能

  

如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。

答案 3 :(得分:0)

因为使用错误的格式说明符是未定义的行为。它可以打印任何东西。

实际上它取决于ABI以及它如何传递浮点数参数和int参数。在许多系统中,浮点值在为此用途保留的寄存器中传递,而int值在不同的寄存器中传递。这似乎就是这种情况。

答案 4 :(得分:0)

第二个printf没有转化。您通过使转换说明符("%f")与值的类型(int)不匹配来调用未定义的行为。

答案 5 :(得分:0)

通过执行printf("%f\n",a);,您正在调用未定义的行为。 然而,通过执行printf("%f\n",(float)a);,您输入整数a,以便按预期将值打印为float。

答案 6 :(得分:0)

printf以自己的二进制格式获取其参数。 格式字符串实际上是如何解释这种二进制数据的描述。如果此格式字符串与实际提供的二进制数据不对应,则行为最多不确定。