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
),但是你传递一个int
。 double
的格式与int
的格式不同(对于最常用的double
格式,请参阅IEEE-754 )
第二个是类似的: printf
期望一个int
(由于%d
),但你传入一个double
传入错误类型时如何解释实际值是未定义的(可能取决于endiannes等)
printf
不是类型安全的,您应该确保为要打印的数据类型使用正确的格式描述符,或者不保证printf
将产生的结果。