[英]Why does printf print wrong values?
为什么在使用printf("%f\\n", myNumber)
打印一个int
时为什么得到错误的值?
我不明白为什么它在%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
当然,它会打印“怪异”的东西。 您正在传递int
,但是告诉printf
您已传递float
。 由于这两种数据类型具有不同且不兼容的内部表示形式,因此您将获得“乱码”。
当您将变量传递给变量函数如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 */
如果要将它们打印为浮点型,可以在将它们传递给printf函数之前将它们强制转换为浮点型。
printf("%f %f %f %f %f\n", (float)a, (float)b, (float)c, (float)d, (float)e);
a,b,c,d和e不是浮点数。 printf()将它们解释为浮点数,这会将奇怪的东西打印到屏幕上。
在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
注意: printf()
double
格式说明符为%f
。
问题是...在printf
内部。 发生以下情况
if ("%f") {
float *p = (float*) &a;
output *p; //err because binary representation is different for float and int
}
printf和变量参数的工作方式是字符串中的格式说明符,例如“%f%f”,它告诉printf类型以及参数的大小。 通过为参数指定错误的类型,会引起混淆。
在stdarg.h中查看用于处理变量参数的宏
对于“普通”(指定了所有类型的非variadac函数),编译器将在需要时将整数类型转换为浮点类型。
对于variadac参数则不会发生这种情况,这些参数始终按 “原样”传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.