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.
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
'18 Août 2013
'
J'ai pris en compte l'ensemble des corrections. Une nouvelle version électronique devrait donc voir le jour.
Une précision cependant :
- p. 165 du PDF printf(“Elément %d : ”, i+1); > Élément
n'est pas ou difficilement possible, nous sommes dans le code donc oui pour les accents mais pas pour les majuscules accentuées.
Pourriez vous préciser la demande :
+ corriger les tableaux des pages 8, 24, 43, 46, 47, 48, 50, 77, 84, 91, 103, 108, 113, 121, 122, 127, 134,144, 147, 148, 154, 158, 162, 167, 187, 198, 199 et 201 du PDF > point-virgule à la fin d'un item de liste, sauf le dernier où il faut un point
Merci pour votre participation
Eric
—-