Corrections pour Le C en 20 heures

Valeur de a : 34567890213455

Valeur de b : 56543210987678

Valeur de a + b : -2

C'est normal, les entiers sont compris entre deux valeurs et ici le résultat dépasse le maximum. Une explication par un spécialiste serait la bienvenue, je pense.

—> Cela est dû à la représentation machine concernant le stockage en mémoire des entiers. Sur une architecture 32bits, la valeur maximale des (signed) int est par exemple pow(2,31)-1 (32-1 : bit de signe), soit 2147483647. pow(2,31) affiche alors -2147483648. En effet, le stockage des int est cyclique face à l'incrémentation, cf http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base#Entiers et mon commentaire suivant).

“Remarque : Il aurait été possible d’utiliser %d du fait que l’arrondi est un nombre entier !”

Vraiment ? Tout comme au-dessus, je pense qu'il s'agit d'une erreur 'importante' concernant la représentation machine des entiers et flottants, cela m'étonne qu'elle figure dans cet ouvrage et qu'elle n'ait été relevée par personne.

Les entiers sont stockés selon la règle “naturelle” en binaire, avec l'ajout du bit de signe, selon la norme et l'implémentation avec la régle du complément à 1, à 2 etc. Les flottants sont stockés selon la norme IEEE 754 le plus souvent, avec la notation mantisse/exposant (une fois de plus, cf http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base).

De ce fait, afficher une variable définie et calculée comme float avec un format d'entier n'a 'aucun sens'. Les notations de stockage mémoire n'étant pas les mêmes, les valeurs ne corresponderont en aucune manière (l'entier 12 et le flottant 12. n'ont pas du tout la même représentation machine).

Cela peut paraître puriste comme remarque, mais une mauvaise compréhension de cette représentation au sein d'un langage tel que C peut mener à beaucoup d'erreurs.

(De plus, je crois qu'il y a une erreur entre + et / .)

Du point de vue technique, il n'y a rien à redire. Cependant, “votre nombre est plus grand” et “mon nombre est plus petit” étant logiquement équivalents, il est peu aisé de s'y retrouver à l'utilisation, les choix se faisant selon ces réponses.


V2 - mai 2013

if (err != 0) { / * si er différent de 0 */ > err ou er ? préférez if (err !=0) à if (er) ! ! ! > err ou er ?

pointeurs/tableaux. . . ne vous inquiétez pas si vous ne comprenez pas tout pour l’instant. . . > retirer ces points de suspension qui ne servent à rien