Je travaillais sur ce programme et j'ai remarqué que l'utilisation de% F pour un double et% D pour un flotteur me donne quelque chose de complètement différent. Tout le monde sait pourquoi cela se produit? Ceci est la sortie P> float = -1610612736
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000
4 Réponses :
Cela concerne les représentations internes des données. Vous essayez d'imprimer un flotteur comme s'il s'agissait d'INT, qui a une représentation interne (binaire) complètement différente. P>
Le cas
En raison de la façon dont les paramètres variables fonctionnent, c ne contient aucune idée du type de valeur que vous en passez à autre que Eh bien, le double est de 8 octets sur la plupart des systèmes pendant que le flotteur est de 4 octets. Les deux types ne sont donc pas compatibles binaires tels quels. Et c'est comme essayer d'interpréter une chaîne comme un double, ou un autre type incompatible. p> % d code> et
% f code>. Lorsque vous passez dans un paramètre variable, vous faites fondamentalement
(vide *) et myvalue code> car ni le compilateur, ni la fonction au moment de l'exécution ne peuvent déterminer le type de variable sauf pour ce qui est donné dans la chaîne de formatage . Donc, même s'il existe une conversion implicite disponible, le compilateur ne sait pas que cela est nécessaire. p>
Correct, mais il ne s'agit pas vraiment de la compatibilité entre float code> et
double code> spécifiquement. En fait, des arguments variadiques de
float code> sont toujours favorisés à
double code> avant de passer, ce qui signifie que
float code> n'est pas impliqué dans quoi que ce soit ici. Les deux valeurs transmises à
printf code> ont
double code> type. À l'intérieur du premier est interprété comme un
int code> (en raison de
% d code> spécificateur). L'incompatibilité entre
int code> et
double code> est ce qui cause le comportement non défini non défini.
Avec une fonction variadique telle que printf () code>, tout
float code> La valeur passée dans le cadre de la liste d'arguments variable est automatiquement convertie en
double code> (voir C11 §6.5.2.2 Appels de fonction ¶6 & 7 ).
Je ne peux vraiment pas être d'accord avec "Vous faites fondamentalement (void *) et myvalue code>" - les valeurs sont transmises comme des valeurs et non comme des pointeurs.
% d code> représente une décimale et il s'attend à un argument de type
int code> (ou un type d'entiers signé plus petit qui est ensuite promu). Types de points flottants
float code> et
Double code> Les deux sont passés de la même manière (promu au
double code>) et les deux utilisent les deux
% f < / code>. En C99, vous pouvez également utiliser
% LF code> pour signifier la taille plus grande de
double code>, mais ceci est purement cosmétique (remarquez qu'avec
scanf code> aucune promotion ne se produit et cela fait en réalité une différence). P>
Eh bien, c'est vrai CODEPAD.ORG/LABE8LGY Mais je me demande comment cela fonctionne réellement ..
% D imprime un entier, votre PrintF interpréte donc votre variable A comme int. p>
avec GCC 3.4.6, je reçois des 0 à la fois pour les deux valeurs avec votre code (après avoir pris l'initialisation de F, une erreur de compilateur). Je soupçonne que cela a à voir avec la partie de la variable d'une variable qui est interprétée comme une étant 0, puis le compilateur est confus ... (Il y a probablement une meilleure explication, mais je ne peux pas y penser). < / p>
Utiliser% f pour les deux impressions variables 1.000000 pour les deux variables pour moi. P>
Vous pouvez trouver une liste des caractères de conversion près du bas de cette page: P>
http: / /www.exforsys.com/tatudials/c-language/maning-input-and-Output-operations-in-c.html P>
L'erreur de compilateur associée à f code> est qu'elle ne peut pas être attachée à un entier (par exemple,
1.0f code> est bien).
Voir la spécification C11 pour §7.21.6.1 Le
Printf < / Code> Fonction
(ou la spécification POSIX pourFPRRINTF () code>
) Pour plus d'informations sur l'utilisation d'utiliserprintf () code> correctement et aussi §6.5.2.2 Appels de fonction ¶6 et 7 à propos de la manière dont les arguments de point flottant sont transmis aux fonctions variadiques. Les compilateurs C modernes tels que GCC et Clang fournissent facilement des diagnostics étendus pour des incompatibles au format - vous devez activer les avertissements de compilation.