且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

为什么printf的打印错误的价值观?

更新时间:2023-02-27 09:24:31

嗯,当然它打印怪异的东西。您传递 INT S,但告诉的printf 您在通过浮动秒。由于这两个数据类型有不同的和不兼容的内部重新presentations,你会得到胡言乱语。

有没有自动投当你通过变量如的printf A variandic功能,值传递给函数的数据类型,它们实际上是(或升级在某些情况下一个较大的兼容型)。

你做了什么有点类似这样的:

 工会{
    INT N;
    浮F;
} X;x.n = 10;的printf(%F \\ N,x.f); / *传递二进制重新presentation 5,
                        但对待同样的位模式为float,
                        即使它们是不兼容的* /

Why do I get the wrong values when I print an int using printf("%f\n", myNumber)?

I don't understand why it prints fine with %d, but not with %f. Shouldn't it just add extra zeros?

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

well of course it prints the "weird" stuff. You are passing in ints, but telling printf you passed in floats. Since these two data types have different and incompatible internal representations, you will get "gibberish".

There is no "automatic cast" when you pass variables to a variandic function like printf, the values are passed into the function as the datatype they actually are (or upgraded to a larger compatible type in some cases).

What you have done is somewhat similar to this:

union {
    int n;
    float f;
} x;

x.n = 10;

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