C printf en utilisant% d et% f

Je travaillais sur ce programme et j’ai remarqué que l’utilisation de% f pour un double et% d pour un float me donnait quelque chose de complètement différent. Quelqu’un sait pourquoi cela se produit?

int main () { float a = 1F; double b = 1; printf("float =%d\ndouble= %f", a, b); } 

C’est la sortie

 float = -1610612736 double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000 

En raison du fonctionnement des parameters de variable, C n’a aucune idée du type de valeur que vous lui transmettez réellement autre que %d et %f . Lorsque vous transmettez un paramètre de variable, vous effectuez (void*)&myvalue car ni le compilateur, ni la fonction au moment de l’exécution ne peuvent déterminer le type de la variable, à l’exception de ce qui est indiqué dans la chaîne de formatage. Ainsi, même s’il existe une conversion implicite disponible, le compilateur ne sait pas qu’elle est nécessaire.

Eh bien, double correspond à 8 octets sur la plupart des systèmes, tandis que float correspond à 4 octets. Donc, les deux types ne sont pas compatibles binarys tels quels. Et c’est comme essayer d’interpréter une chaîne comme un double ou un autre type incompatible.

%d signifie décimal et attend un argument de type int (ou un type plus petit d’entier signé qui sera ensuite promu). Les types à virgule float et double sont passés de la même manière (promus au double ) et utilisent %f . En C99, vous pouvez également utiliser %lf pour indiquer la taille plus grande du double , mais ceci est purement esthétique (notez qu’avec scanf aucune promotion ne survient et que cela fait réellement une différence).

Cela concerne les représentations internes des données. Vous essayez d’imprimer un float comme s’il s’agissait d’un int, qui a une représentation interne (binary) complètement différente.

Le double cas est similaire. Vous avez probablement des ordures (toutes les données) après la variable float. Cette poubelle est interprétée comme faisant partie de la double valeur.

% d affiche un entier, votre printf interprétera donc votre variable a comme un entier.

Avec gcc 3.4.6, j’obtiens des 0 pour les deux valeurs avec votre code (après avoir retiré le F de l’initialisation, car cela entraînait une erreur du compilateur). Je suppose que cela a à voir avec la partie de la variable qui est interprétée comme un entier égal à 0, puis le compilateur est confus … (il y a probablement une meilleure explication, mais je n’y pense pas).

Utiliser% f pour les deux variables imprime pour moi 1.000000 pour les deux variables.

Vous pouvez trouver une liste des caractères de conversion vers le bas de cette page:

http://www.exforsys.com/tutorials/c-language/managing-input-and-output-operations-in-c.html