C printf () mit %d und %f
Ich arbeitete an diesem Programm, und ich bemerkte, dass die Verwendung von %f für einen double und %d für die float gibt mir etwas ganz anderes. Niemand weiß, warum dies passiert?
int main ()
{
float a = 1F;
double b = 1;
printf("float =%d\ndouble= %f", a, b);
}
Dies ist die Ausgabe
float = -1610612736
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000
- vielen Dank an alle für die Kommentare. ich bekomme es jetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufgrund der Art der Variablen Parameter arbeiten, C hat keine Idee von der Art der Wert, den Sie tatsächlich an anderen als
%d
und%f
. Wenn Sie übergeben in eine variable Parameters, den Sie im Grunde tun(void*)&myvalue
weil weder der compiler, noch die Funktion zur Laufzeit kann bestimmen den Typ der Variablen, außer für das, was gegeben ist, in der Formatzeichenfolge. Also auch wenn es eine implizite Konvertierung zur Verfügung, die der compiler nicht weiß, dass es benötigt wird.Gut, double ist 8 Byte auf den meisten Systemen, während float ist mit 4 Byte. Also die beiden Typen sind nicht Binär-kompatibel, wie es ist. Und es ist wie der Versuch zu interpretieren, einen string, einen double, oder eine andere inkompatible geben.
float
unddouble
speziell. Tatsächlich, Variable Argumente vonfloat
Art sind immer gefördert werden, umdouble
vor der übergabe, was bedeutet, dassfloat
Typ ist nicht involviert in alles hier. Beide Werte, die übergeben werden, umprintf
habendouble
geben. Innerhalb der ersten wird interpretiert als eineint
(wegen%d
Planer). Die Unvereinbarkeit zwischenint
unddouble
ist, was die beobachteten Undefiniertes Verhalten.%d
steht für dezimal und erwartet ein argument vom Typint
(oder einige kleinere Ganzzahl-Typ, der wird dann gefördert). Floating-point-Typenfloat
unddouble
bekommen beide bestanden auf die gleiche Weise gefördert werden, umdouble
) und beide%f
. In C99 können Sie auch%lf
Indizien, die auf die größere Größedouble
, aber das ist rein kosmetisch (beachten Sie, dass mitscanf
keine Förderung stattfindet und dies tatsächlich einen Unterschied macht).Es hat zu tun mit der internen Darstellung von Daten. Sie zu drucken versuchen, ein schweben, als ob es ein int, die eine völlig andere interne (binäre) Darstellung.
Den Doppel - Fall ist ähnlich. Sie haben wahrscheinlich Müll (alle Daten) nach den float-Variablen. Müll interpretiert wird als Teil des double-Wert.
%d druckt eine ganze Zahl, so dass Ihr von printf () interpretiert die variable a als int.
Mit gcc 3.4.6, bekomme ich 0 für beide Werte mit dem code (nach Einnahme der F aus der eine Initialisierung, so dass die led zu einem compiler-Fehler). Ich vermute, dies hat zu tun mit dem Teil des eine variable, die wird interpretiert als int von 0, und dann den compiler Durcheinander kommt ... (es ist wahrscheinlich eine bessere Erklärung, aber ich kann nicht daran denken).
Verwendung von %f für beide Variablen druckt 1.000000 für beide Variablen für mich.
Finden Sie eine Liste mit der Konvertierung von Zeichen in der Nähe der Unterseite dieser Seite:
http://www.exforsys.com/tutorials/c-language/managing-input-and-output-operations-in-c.html
F
ist, da es nicht befestigt werden kann, um einen integer (z.B.1.0F
ist in Ordnung).