为什么printf打印错误的值?

时间:2010-09-07 01:46:00

标签: c printing type-conversion printf

使用int打印printf("%f\n", myNumber)时,为什么会出现错误的值?

我不明白为什么它使用%d打印正常,但不能打%f。它不应该只添加额外的零吗?

int a = 1;
int b = 10;
int c = 100;
int d = 1000;
int e = 10000;

printf("%d %d %d %d %d\n", a, b, c, d, e);   //prints fine
printf("%f %f %f %f %f\n", a, b, c, d, e);   //prints weird stuff

7 个答案:

答案 0 :(得分:14)

当然,它打印出“怪异”的东西。您正在传递int s,但是告诉printf您传递了float s。由于这两种数据类型具有不同且不兼容的内部表示,因此您将获得“乱码”。

当你将变量传递给像printf之类的变量函数时,没有“自动强制转换”,这些值作为它们实际的数据类型传递给函数(或者在某些情况下升级为更大的兼容类型)

你所做的有点类似于:

union {
    int n;
    float f;
} x;

x.n = 10;

printf("%f\n", x.f); /* pass in the binary representation for 10, 
                        but treat that same bit pattern as a float, 
                        even though they are incompatible */

答案 1 :(得分:4)

如果要将它们打印为浮点数,可以在将它们传递给printf函数之前将它们转换为float。

printf("%f %f %f %f %f\n", (float)a, (float)b, (float)c, (float)d, (float)e);

答案 2 :(得分:3)

a,b,c,d和e不是浮点数。 printf()将它们解释为浮点数,这会将奇怪的东西打印到你的屏幕上。

答案 3 :(得分:2)

printf()中使用不正确的格式说明符会调用Undefined Behaviour

例如:

 int n=1;
 printf("%f", n); //UB

 float x=1.2f;
 printf("%d", x); //UB

 double y=12.34;
 printf("%lf",y); //UB 

注意:doubleprintf()的格式说明符为%f

答案 4 :(得分:1)

问题是...... printf内部。发生以下情况

if ("%f") {
 float *p = (float*) &a;
 output *p;  //err because binary representation is different for float and int
}

答案 5 :(得分:0)

printf和variable参数的工作方式是字符串中的格式说明符,例如“%f%f”告诉printf类型,从而告诉参数的大小。通过为参数指定错误的类型,它会变得混乱。

查看stdarg.h以获取用于处理变量参数的宏

答案 6 :(得分:0)

对于“normal”(指定了所有类型的非variadac函数),编译器会将整数值类型转换为需要的浮点类型。

variadac参数不会发生这种情况,总是按“原样”传递。