这是我的代码的一部分。
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中运行
答案 0 :(得分:7)
效果很好,但为什么要将错误的数据传递给它呢? %d
说明符期望和int
,但您传递的是其他内容。不好的主意。
如果float
和int
在varargs障碍中的大小不同,则这是未定义的行为。由于float
是typically 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);
实际上确实如此。
要了解它的作用,您需要分析您的实现,或者至少分析编译器为该代码生成的程序集。
翻译该代码的常用方法是在浮点寄存器中传递提升的(到double
)float
参数,并告诉printf
在浮点寄存器中传递了多少个参数。但是由于格式告诉printf
寻找int
,它不会在浮点寄存器中查找它,而是在另一个寄存器中。因此,当调用printf
时,打印的值将是该寄存器中发生的任何内容。