Wie ist die Umwandlung von float/double nach int behandelt in printf?

Betrachten Sie dieses Programm

int main()
{
        float f = 11.22;
        double d = 44.55;
        int i,j;

        i = f;         //cast float to int
        j = d;         //cast double to int

        printf("i = %d, j = %d, f = %d, d = %d", i,j,f,d);
        //This prints the following:
        //i = 11, j = 44, f = -536870912, d = 1076261027

        return 0;
}

Kann mir jemand erklären, warum das casting von double - /float-zu-int-funktioniert einwandfrei in dem ersten Fall, und nicht arbeiten, wenn getan, in printf?
Dieses Programm wurde kompiliert gcc-4.1.2 auf 32-bit-linux-Maschine.


EDIT:
Zach ' s Antwort scheint logisch, D. H. die Nutzung der format-Spezifizierer, um herauszufinden, was zu pop vom Stapel. Aber dann betrachten Sie diese follow-up-Frage:

int main()
{

    char c = 'd';    //sizeof c is 1, however sizeof character literal
                     //'d' is equal to sizeof(int) in ANSI C

    printf("lit = %c, lit = %d , c = %c, c = %d", 'd', 'd', c, c);
    //this prints: lit = d, lit = 100 , c = d, c = 100
    //how does printf here pop off the right number of bytes even when
    //the size represented by format specifiers doesn't actually match 
    //the size of the passed arguments(char(1 byte) & char_literal(4 bytes))    

 return 0;
}

Wie funktioniert das?

Ich hatte eine ähnliche Zweifel. Siehe diesen thread: stackoverflow.com/questions/2377733/how-does-this-program-work
char ist ein einzelnes Zeichen - es ist einfach eine 8-bit-Ganzzahl. Wenn Sie tun, jede Art von operation auf Integrale Art, die kleiner als int sind, werden Sie befördert zu integer. Dies gilt auch, wenn eine Funktion aufrufen. Also eigentlich ist es nicht nur Zufall verursacht die printf-Aufruf zu arbeiten, dieses Verhalten definiert ist. Praktisch gesprochen, in den meisten C-ABIs man immer reservieren Sie mindestens eine Maschine pro Wort-variable auf den stack gelegt.
Ja, <stdarg> parameter übergeben berücksichtigt nur Arten gefördert, die nach default argument promotions (C11 §6.5.2.2/6, §7.16.1.1/2), das garantiert, dass char und int sind kompatibel gemacht. Dies ist jedoch nicht ganz das gleiche wie die Aktionen verwendet, für die Arithmetik. Auch, es ist gefährlich, auf Grund der Sprache in Bezug auf das ABI. Die Bestätigung, dass es OK ist wirklich erfordert eine überprüfung der Regeln.
Wie hat mein Kommentar gelöscht wurde?
Sehr seltsam. Diese Website hat eine Menge von Moderatoren und manchmal Dinge tun, nach dem Zufallsprinzip verschwinden.

InformationsquelleAutor Sandip | 2010-03-08

Schreibe einen Kommentar