Comme d'autres l'ont dit, vous devez utiliser le format %f
pour imprimer des flotteurs, non %d
, qui est pour les entiers. Il y a aussi %e
, qui imprime le flottant en notation scientifique au lieu de la notation fixe, et il y a aussi %g
, qui l'imprime en scientifique ou fixe, selon la plus courte des deux. La raison pour laquelle il imprime 0 est que les arguments flottants sont automatiquement convertis en doubles lorsqu'ils sont passés en arguments à des fonctions variées (c'est-à-dire des fonctions qui prennent un nombre d'arguments non spécifié) comme printf()
. Les représentations des nombres 2 et 3 (les valeurs de x
et y
) en tant que doubles sont respectivement 0x4000000000000000 et 0x4008000000000000, tel que calculé par le IEEE-754 Floating-Point Conversion calculator.
Sur les machines little-endian (par exemple basées sur x86), le modificateur %d
récupère les 4 octets suivants de la pile et les interprète comme un nombre entier. Donc, quand vous passez le float 2, il est converti en un double comme 0x4000000000000000, ce qui est 00 00 00 00 00 00 00 40 dans little-endian. Les quatre premiers octets font l'entier 0, c'est ce qui est imprimé.
Notez que si vous avez imprimé les deux chiffres dans une déclaration au lieu de deux, vous obtiendrez un résultat plus surprenant:
printf("x=%d y=%d\n", x, y);
// Output: x=0 y=1073741824
La plupart des compilateurs peuvent vous mettre en garde contre ces types d'erreurs si vous définissez le niveau d'alerte élevé assez. Avec GCC, vous devriez compiler avec l'option -Wformat
(ou -Wall
, qui inclut -Wformat
), et il vous avertira lorsque vous essaierez d'imprimer un flotteur avec %d
par accident.
Essayez printf ("x is% f \ n", x); –
Cette erreur est facile à faire, mais difficile à faire par la personne qui l'a fait. Demandez-le à quelqu'un d'autre et vous obtiendrez la réponse dans une minute :) – Ashwin
En fait, il n'y a pas de spécificateur de conversion printf pour les flottants. Le spécificateur de conversion '% f' attend un double argument: heureusement, les arguments float sont convertis en double lorsque printf() est appelé. Ma suggestion: n'utilisez jamais de flotteurs; toujours utiliser des doubles. – pmg