web-dev-qa-db-fra.com

Comment printf et co font la différence entre float et double

Comme il n'est pas fortement typé, je pensais qu'il avait juste choisi la bonne taille de mémoire et l'interprétait en fonction du type d'argument. Mais float et double utilisent tous deux% f et ce sont des tailles différentes.

P.S. Je peux voir comment la promotion via la copie de la valeur dans un temp et un casting (est-ce vrai?) Pourrait fonctionner mais comment cela fonctionne-t-il pour scanfs/sscanf?

46
Roman A. Taycher

Cela ne différencie pas. Il n'est pas possible de recevoir un float en tant que vararg: tout argument float que vous fournissez est d'abord promu en double.

6.5.2.2/6 définit les "promotions d'arguments par défaut" et/7 indique que les promotions d'arguments par défaut sont appliquées aux "arguments de fin", c'est-à-dire les varargs dénotés par ....

comment ça marche pour scanfs/sscanf?

Le format %f Pour scanf nécessite un pointeur sur float. %lf Nécessite un pointeur vers double, %Lf Nécessite un pointeur vers long double.

copier la valeur dans un temp et lancer (est-ce vrai?)

Si vous fournissez un argument float, l'implémentation crée un temporaire de type double, l'initialise avec la valeur float et le transmet comme vararg. La conversion par définition est explicite conversion en utilisant l'opérateur de conversion - vous pouvez caster si vous le souhaitez afin de faire clairement comprendre au lecteur ce qui se passe, mais float f = 3; printf("%f", f); est exactement la même chose que float f = 3; printf("%f", (double)f);. La promotion d'argument par défaut a la même signification que le cast.

66
Steve Jessop