Pourquoi printf génère-t-il des valeurs aléatoires pour double et 0.000000 pour int?

Je sais que c’est une question simple, mais c’est ce qui m’était arrivé lorsque je codais et je me demande comment cela fonctionne maintenant. Donc, ma première question est la suivante: quand on donne à printf un entier comme ci-dessous, mais dans l’attente d’une valeur% f float, pourquoi génère-t-il toujours 0.000000? J’exécute ceci dans GCC sur le terminal linux.

int main() { int a = 2, b = 5, result = 0; result = b/a*a; printf("%f\n", result); } //Above printf statement outputs 0.000000 every time. 

Ensuite, lorsque j’utilise le code ci-dessous et que je donne un double à printf lorsqu’il attend une valeur entière de% i, le résultat est toujours aléatoire / garbage.

 int main() { double a = 2, b = 5, result = 0; result = b/a*a; printf("%i\n", result); } //Above printf statement outputs random numbers every time. 

Je comprends tout à fait que le code ci-dessus est incorrect car le type de sortie printf n’est pas le même que celui que j’ai saisi, mais j’attendais qu’il agisse de la même manière pour chaque forme d’erreur au lieu de changer de la sorte. Juste attiré ma curiosité alors j’ai pensé que je demanderais.

Fondamentalement, parce que si vous interprétez les bits qui constituent un petit entier comme s’ils étaient un double, cela ressemble à la valeur double de 0. Tandis que si vous interprétez les bits qui représentent une petite valeur double comme un entier, cela ressemble à quelque chose de plus intéressant. Voici un lien vers une page qui décrit comment les bits sont utilisés pour représenter un double: http://en.m.wikipedia.org/wiki/IEEE_floating_point . Avec ce lien et un peu de patience, vous pouvez réellement calculer la valeur entière qui serait interprétée par un double donné.

Vous avez utilisé les mauvais spécificateurs de format Il devrait être

 int a = 2, b = 5, result = 0; result = b/a*a; printf("%d\n", result); ... double a = 2, b = 5, result = 0; result = b/a*a; printf("%f\n", result);