以下代码:
#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.为什么会这样?
答案 0 :(得分:4)
这很令人困惑,但是%d
是一个整数的格式,例如%i
(大多数人都希望它是双倍的,因为%f
是浮点数,但事实并非如此)。你不能将它与双重一起使用,你必须使用%f
。与%f
相同,您不能使用整数;你必须使用浮动或双倍。
此外,printf
不检查您使用它的类型,它只是盲目地将字节解释为您告诉它的类型。使用错误类型和错误的类型说明符会产生未定义的行为,这就是您看到自己的原因。
答案 1 :(得分:2)
在第一种情况下,printf
会扩展double
(由于%f
),但您传递的是int
。 double
的格式与int
的格式不同(有关最常用的double
格式,请参阅IEEE-754)
第二个类似:printf
期望int
(由于%d
),但您传入double
传入错误类型时如何解释实际值是未定义的(可能取决于endiannes等)
答案 2 :(得分:1)
printf
不是类型安全的,您应该确保对要打印的数据类型使用正确的格式描述符,或者不保证printf
将产生的结果。