c中的printf函数

时间:2012-10-23 14:09:50

标签: c printf

这是我的代码的一部分。

float a = 12.5;
printf("%d\n", a);
printf("%d\n", (int)a);
printf("%d\n", *(int *)&a);

float a = 12.5; printf("%d\n", a); printf("%d\n", (int)a); printf("%d\n", *(int *)&a);

当我在windows中编译时,我得到了:

然后,我在linux中编译,我得到: 0 12 1094713344

每次我执行时,

-1437851864 12 1094713344 都会被更改。 我的问题是:“printf”函数如何在linux中运行

3 个答案:

答案 0 :(得分:7)

效果很好,但为什么要将错误的数据传递给它呢? %d说明符期望和int,但您传递的是其他内容。不好的主意。

如果floatint在varargs障碍中的大小不同,则这是未定义的行为。由于floattypically promoted to double并且调用了varargs,如果您的int小于double这将会中断。

简而言之,这是非常糟糕和破坏的代码。不要这样做。

答案 1 :(得分:3)

要在C中打印浮点数,您应该执行以下操作:

float a = 12.5;
printf("%f\n", a);

答案 2 :(得分:0)

如前所述,传递类型与格式字符串不匹配的参数会调用未定义的行为,因此语言标准不对任何内容施加任何限制

float a = 12.5;
printf("%d\n", a);
实际上确实如此。

要了解它的作用,您需要分析您的实现,或者至少分析编译器为该代码生成的程序集。

翻译该代码的常用方法是在浮点寄存器中传递提升的(到doublefloat参数,并告诉printf在浮点寄存器中传递了多少个参数。但是由于格式告诉printf寻找int,它不会在浮点寄存器中查找它,而是在另一个寄存器中。因此,当调用printf时,打印的值将是该寄存器中发生的任何内容。