1

For the following code:

#include <stdio.h>
int main(){
    printf("%f", 5);
    printf("%d", 5.01);
}

The first statement will print 0.000000 and the second statement will print a large number.

I thought the printf see the format %f will pop a 4-byte argument from stack. Then I looked up some references that say the printf function will transform float into double, so 8-byte argument. So I thought it may print out a unpredictable value. But how could it print out a 0.000000.

The second one is also weired. The binary format for 5.01 should be 0 10000001 01000000101000111101100 (0x40A051EC), It should be 1084248556 in decimal format, but the result of the statement is 1889785610. Why is this happen?

4

3 回答 3

4

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

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

于 2012-05-01T14:14:08.473 回答
2

在第一种情况下,printf提取 a double(由于%f),但您传递了int. 的格式double是不同的形式int(参见IEEE-754了解最常用的double格式)

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

当您传入不正确的类型时如何解释实际值是未定义的(可能取决于字节序等)

于 2012-05-01T14:16:11.173 回答
1

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

于 2012-05-01T14:14:20.953 回答