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

5voto

cakeforcerberus Points 2279

Essayez de l'assigner à un unsigned int, pas à un int.

Le terme unsigned int est la clé - par défaut, un type de données int peut contenir des nombres négatifs et positifs ; cependant, les ints non signés sont des nombres positifs. siempre positive. Ils offrent cette option parce que les uints peuvent techniquement contenir des valeurs positives plus importantes que les ints signés ordinaires, car ils n'ont pas besoin d'utiliser un bit pour savoir si la valeur est négative ou positive.

Veuillez voir :

http://stackoverflow.com/questions/247873/signed-versus-unsigned-integers

4voto

Norman Ramsey Points 115730

La représentation binaire de -4, dans un mot de 32 bits, est la suivante (notation hexadécimale)

0xfffffffc

Lorsqu'il est interprété comme un non signé entier, cette configuration binaire représente le nombre 2**32-4 ou 18446744073709551612. Je ne suis pas sûr que je qualifierais ce phénomène de "débordement", mais c'est un erreur commune d'assigner un petit nombre entier négatif à une variable de type non signé et de se retrouver avec un nombre entier positif vraiment grand.

Cette astuce est en fait exploitée pour le contrôle des limites : si vous avez un entier signé i et que vous voulez savoir si elle est dans la plage 0 <= i < n, vous pouvez tester

if ((unsigned)i < n) { ... }

qui vous donne la réponse en utilisant une comparaison au lieu de deux. Le passage à unsigned n'a aucun coût d'exécution ; il indique simplement au compilateur de générer une comparaison unsigned au lieu d'une comparaison signée.

2voto

T.J. Crowder Points 285826

Le problème est que tu stockes -4 dans un fichier non signé int. Les ints non signés ne peuvent contenir que des valeurs positives et nulles. Si vous attribuez -4 à un, vous obtiendrez en fait un très grand nombre positif (la valeur réelle dépend de la largeur de l'int que vous utilisez).

2voto

Justin Points 2022

Le problème est que les tailles de stockage telles que unsigned int ne peut contenir qu'une certaine quantité. Avec 1 et -5, cela n'a pas d'importance, mais avec 1 et -500000000, vous pourriez obtenir un résultat déroutant. Et aussi, unsigned interprétera tout ce qui y est stocké comme étant positif. Vous ne pouvez donc pas mettre une valeur négative dans un fichier unsigned variable.

Deux grandes choses à surveiller :
1. Débordement dans l'opération elle-même : 1 + -500000000
2. Questions relatives au moulage : (unsigned int)(1 + -500)

0voto

Andrew Keeton Points 6268

Par définition le nombre -4 ne peut pas être représenté dans un unsigned int . -4 est un nombre entier signé. Il en va de même pour tout nombre négatif.

Lorsque vous attribuez un nombre entier négatif à un unsigned int les bits réels du nombre ne changent pas, mais ils sont simplement représenté différemment. Vous obtiendrez un nombre ridiculement grand en raison de la façon dont les entiers sont représentés en binaire. (complément à deux) .

En complément à deux, -4 est représenté par 0xfffffffc . Quand 0xfffffffc est représenté par un unsigned int vous obtiendrez le numéro 4,294,967,292 .

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