Comment est-conversion de float, double, int manipulé dans un printf?

Estime que ce programme

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;
}

Quelqu'un peut m'expliquer pourquoi le casting de double/float en int fonctionne correctement dans le premier cas, et ne fonctionne pas lorsqu'il est effectué dans printf?
Ce programme a été compilé sur gcc-4.1.2 sur 32 bits machine linux.


EDIT:
Zach répondre semble logique, c'est à dire utiliser des spécificateurs de format pour comprendre ce qu'il faut de pop hors de la pile. Toutefois considérer cette question de suivi:

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;
}

Comment cela fonctionne?

J'ai eu le même doute. Voir ce fil: stackoverflow.com/questions/2377733/how-does-this-program-work
char est un caractère unique - c'est tout simplement un entier 8 bits. Lorsque vous effectuez une opération sur le type intégral qui sont plus petits que int, elles sont promues en entier. Cela inclut l'appel d'une fonction. Donc en fait il n'est pas hasard la cause de votre printf appel à travailler, ce comportement est défini. En pratique, dans la plupart des C ABIs vous toujours allouer au moins une machine de mot par variable passés sur la pile.
Oui, <stdarg> passage de paramètres prend uniquement en compte les types promu selon l'argument par défaut promotions (C11 §6.5.2.2/6, §7.16.1.1/2), ce qui ne garantit pas que char et int sont compatibles. Cependant, ce n'est pas tout à fait les mêmes que les promotions utilisé pour l'arithmétique. Aussi, il est dangereux de raisonner sur la langue en termes de l'ABI. Confirmer que c'est OK, faut vraiment vérifier les règles.
Comment mon commentaire a été supprimé?
Très étrange. Ce site a beaucoup de modérateurs et parfois les choses au hasard à disparaître.

OriginalL'auteur Sandip | 2010-03-08