0 votes

Problème de débordement de nombres entiers

Veuillez expliquer le paragraphe suivant.

"La question suivante est de savoir si nous pouvons attribuer une certaine valeur à une variable sans perdre la précision. Il ne suffit pas de vérifier le débordement pendant l'addition ou la soustraction, car quelqu'un pourrait ajouter 1 à -5 et affecter le résultat à un int non signé. Alors l'addition réelle ne déborde pas, mais le résultat ne correspond toujours pas."

Quand j'ajoute 1 à -5, je ne vois pas de raison de m'inquiéter, la réponse est comme il se doit -4. Alors quel est le problème de l'inadéquation du résultat ? Vous pouvez trouver ici l'article complet que j'ai lu :

http://www.fefe.de/intof.html

0voto

Pablo Points 44881

Les variables non signées, comme les int non signés, ne peuvent pas contenir de valeurs négatives. Donc assigner 1 - 5 à un unsigned int ne vous donnera pas -4. Je ne suis pas sûr de ce que cela vous donnera, c'est probablement spécifique au compilateur.

0voto

sharptooth Points 93379

Un certain code :

signed int first, second;
unsigned int result;

first = obtain(); // happens to be 1
second = obtain(); // happens to be -5
result = first + second; // unexpected result here - very large number - and it's too late to check that there's a problem

Disons que vous avez obtenu ces valeurs à partir du clavier. Vous devez vérifier avant l'addition que le résultat peut être représenté en unsigned int. C'est ce dont parle l'article.

0voto

Il faut se souvenir que fondamentalement, on travaille avec des bits. Vous pouvez donc attribuer une valeur de -4 à un entier non signé, ce qui placera une série de bits dans cet emplacement mémoire. Ces bits peuvent être interprétés comme -4 dans certaines circonstances . L'une de ces circonstances est évidente : vous avez indiqué au compilateur/système que les bits de cet emplacement mémoire devaient être interprétés comme un nombre signé à deux compléments. Donc, si vous faites printf("%s",i) printf fait sa magie et convertit le nombre complémentaire à deux en une magnitude et un signe. L'amplitude sera de 4 et le signe sera négatif, il affiche donc '-4'.

Cependant, si vous indiquez au compilateur que les données de cet emplacement mémoire ne sont pas signées, alors les bits ne changent pas mais à la place leur interprétation fait. Ainsi, lorsque vous effectuez une addition, que vous stockez le résultat dans un emplacement mémoire de type entier non signé et que vous appelez ensuite printf sur le résultat, il ne prend pas la peine de chercher le signe car, par définition, il est toujours positif. Il calcule la magnitude et l'imprime. La magnitude sera fausse car l'information du signe est toujours encodée dans les bits, mais elle est traitée comme une information de magnitude.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X