在printf格式和参数不一致(Format and arguments inconsistency

2019-09-28 00:54发布

对于下面的代码:

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

第一条语句将打印0.000000和第二语句将打印大量。

我以为看到的printf格式%F就会弹出堆栈从一个4字节的说法。 然后,我查阅了一些引用说printf函数将转变成浮动双,所以8个字节的参数。 因此,我认为它可以打印出一个不可预测的值。 但是,它如何能打印出0.000000。

第二个也weired。 5.01二进制格式应为0 10000001 01000000101000111101100(0x40A051EC),它应该是十进制格式1084248556,但声明的结果是1889785610.为什么出现这种情况?

Answer 1:

这是混乱的,但%d是一个整数的制作,如%i (大多数人期望它是双自%f是浮动的,但它不是)。 你不能用双重使用它,你必须使用%f 。 同样的, %f ,你不能使用它的整数。 您必须使用float或double。

此外, printf不检查你使用它的类型,它只是一味地解释字节你告诉它你给它的类型。 使用错误类型的错误类型说明符产生不确定的行为这就是为什么你看到你是什么。



Answer 2:

在第一种情况下, printf extects一个double (由于%f ),但传递一个int 。 的格式double是不同形式int (见IEEE-754为最常用的double格式)

第二个是相似的: printf期望一个int (由于%d ),但你在通过double

如何当你在一个不正确的类型通过实际的值解释是不确定的(可以依赖于字节序等)



Answer 3:

printf不是类型安全的,你应该确保你使用正确的格式描述你想要打印或不存在,结果保证数据类型printf会产生。



文章来源: Format and arguments inconsistency in printf
标签: c printf