繁体   English   中英

对printf输出感到困惑

[英]Puzzled about printf output

在将printf与%d用作格式说明符并给定float作为参数(例如2.345)时,它将输出1546188227。因此,我知道这可能是由于单点float精度格式转换为简单的十进制格式。 但是,当我们使用%d作为格式说明符打印2.000时,为什么它只打印0? 请帮忙。

格式说明符%d只能与int类型(和兼容类型)的值一起使用。 尝试将%dfloat或任何其他类型一起使用会产生未定义的行为。 这是真正适用于此的唯一解释。 从语言的角度来看,您看到的输出基本上是随机的。 并且您不能保证完全得到任何输出。

如果您仍然有兴趣调查所看到的输出的特定原因(无论从多大意义上来说),则必须执行特定于平台的调查,因为实际行为主要取决于各种实现细节。 而且,您甚至在帖子中都没有提到平台。

在任何情况下,请注意,不可能将float值作为变量参数传递给变量函数。 在这种情况下, float值始终转换为double并作为double传递。 因此,在您的情况下,您尝试打印的是double值。 行为仍未定义。

转到此处 ,输入2.345 ,单击“四舍五入”。 观察64位十六进制值: 4002C28F5C28F5C3 观察到15461882270x5c28f5c3

现在重复2.00。 观察到64位十六进制值为4000000000000000

PS:当您说要给一个float参数时,显然是想给一个 精度参数。

ISO / IEC 9899:1999标准$ 7.19.6规定:

If a conversion specification is invalid, the behavior is undefined.239)
If any argument is not the correct type for the corresponding conversion
specification, the behavior is undefined.

如果要使其打印整数值,请在调用中将浮点型转换为整数:

printf("ints: %d %d", (int) 2.345, (int) 2.000);

否则,请使用浮点格式标识符:

printf("floats: %f %f", 2.345, 2.000);

当对相应的参数使用带有错误格式说明符的printf时,结果是未定义的行为。 它可以是任何东西,并且可能因一个实现而异。 只有正确使用指定的格式才能定义行为。

首先是一个小巧的选择:立即数2.345实际上是double类型,而不是浮点数,此外,即使是浮点数(例如立即数2.345f),当用作接受可变数字的函数的参数时,也将转换为double。参数,例如printf。

但是,这里发生的是将(通常)double值的64位发送到printf,然后(通常)将其中的32位解释为整数值。 因此,恰好这些位为零。

根据标准,这就是所谓的未定义行为:允许编译器执行任何操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM