我执行了以下代码
#include <stdio.h>
int main()
{
printf("%f\n", 9/5);
}
输出 :0.000000
why not 1
?
如果我写printf("%f %f %d %d\n", (float)9/5, 4, sizeof(float), sizeof(int));
那么输出是1.800000 0.000000 4 59
why not 1.800000 4 4 4
在我的机器上sizeof (float)
is 4
提前致谢
这是因为你的printf
格式说明符与您传递的内容不匹配:
9/5
属于类型int
. But printf
期望一个float
.
因此,您需要将其转换为浮点数或将文字设置为浮点数:
printf("%f\n", (float)9/5);
printf("%f\n", 9./5);
至于你为什么会得到0.0
,这是因为printf()
正在读取的二进制表示1
(一个整数)并将其打印为float
。这恰好是一个非常接近的小非规范化值0.0
.
EDIT :还有一些与可变参数的类型提升有关的事情。
在可变参数函数中,float
被提升为double
. So printf()
在这种情况下,实际上需要一个 64 位参数来保存double
。但是您只向它传递了一个 32 位操作数,因此它实际上从堆栈中读取了额外的 32 位(在本例中恰好为零) - 甚至更多未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)