0

这是我的代码的一部分。

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

当我在 Windows 中编译时,我得到: 0 12 1094713344

然后,我在linux中编译,我得到了: -1437851864 12 1094713344

-1437851864每次我执行它都会改变。我的问题是:“printf”函数在 linux 中是如何工作的

4

3 回答 3

7

它工作得很好,但你为什么要向它传递错误类型的数据呢?说明%d符期望 and int,但您传递的是其他内容。馊主意。

如果floatint在可变参数屏障上的大小不同,则这是未定义的行为。并且由于 float通常使用可变参数调用来提升 ,如果你的小于你的,这将中断。doubleintdouble

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

于 2012-10-23T14:11:36.647 回答
3

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

float a = 12.5;
printf("%f\n", a);
于 2012-10-23T14:12:10.127 回答
0

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

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

实际上确实如此。

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

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

于 2012-10-23T14:52:06.267 回答