printf中的格式和参数不一致

对于以下代码:

#include  int main(){ printf("%f", 5); printf("%d", 5.01); } 

第一个语句将打印0.000000,第二个语句将打印一个大数字。

我认为printf看到格式%f将从堆栈中弹出一个4字节的参数。 然后我查了一些引用,说printf函数会将float转换为double,所以8字节的参数。 所以我认为它可能会打印出不可预测的价值。 但它怎么能打印出0.000000。

第二个也是经过考虑的。 5.01的二进制格式应为0 10000001 01000000101000111101100(0x40A051EC),十进制格式应为1084248556,但语句结果为1889785610.为什么会发生这种情况?

这很令人困惑,但%d是一个整数的格式,比如%i (大多数人都认为它是双倍的,因为%f是浮点数,但事实并非如此)。 你不能使用双倍,你必须使用%f 。 与%f相同,您不能使用整数; 你必须使用浮动或双倍。

此外, printf不会检查您使用它的类型,它只是盲目地将字节解释为您告诉它的类型。 使用错误类型和错误的类型说明符会产生不确定的行为,这就是为什么你会看到你的样子。

在第一种情况下, printf扩展一个double (由于%f ),但是你传递一个intdouble的格式与int的格式不同(对于最常用的double格式,请参阅IEEE-754 )

第二个是类似的: printf期望一个int (由于%d ),但你传入一个double

传入错误类型时如何解释实际值是未定义的(可能取决于endiannes等)

printf不是类型安全的,您应该确保为要打印的数据类型使用正确的格式描述符,或者不保证printf将产生的结果。