printf中的格式和参数不一致

时间:2012-05-01 14:12:09

标签: c printf

以下代码:

#include <stdio.h>
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.为什么会这样?

3 个答案:

答案 0 :(得分:4)

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

此外,printf不检查您使用它的类型,它只是盲目地将字节解释为您告诉它的类型。使用错误类型和错误的类型说明符会产生未定义的行为,这就是您看到自己的原因。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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