Qu'est-ce qu'une erreur de débordement d'entier?

Qu'est-ce qu'une erreur de débordement d'entier? Pourquoi je me soucie d'une telle erreur? Quelles sont les méthodes permettant de l'éviter ou de l'empêcher?

15
demandé sur Earlz 2010-04-15 01:46:16

9 réponses

le débordement D'entier se produit quand vous essayez d'exprimer un nombre qui est plus grand que le plus grand nombre que le type d'entier peut manipuler.

si vous essayez d'exprimer le nombre 300 dans un octet, vous avez un débordement entier (maximum est 255). 100,000 in two bytes est aussi un overflow entier (65,535 est le maximum).

vous devez vous en soucier parce que les opérations mathématiques ne se comporteront pas comme vous l'attendez. A + B n'égale pas en fait la somme de A et B si vous avez un dépassement d'entier.

vous l'évitez en ne créant pas la condition en premier lieu (habituellement en choisissant votre type d'entier pour être assez grand que vous ne déborderez pas, ou en limitant l'entrée de l'utilisateur de sorte qu'un débordement ne se produise pas).

18
répondu John 2010-04-14 21:51:41

la façon la plus facile de l'expliquer est avec un exemple trivial. Imaginez que nous avons un entier 4 bits non signé. 0 serait 0000 et 1111 serait 15. Donc si vous incrémentez 15 au lieu d'obtenir 16 vous tournerez autour de 0000 comme 16 est en fait 10000 et nous ne pouvons pas représenter cela avec moins de 5 bits. Ergo débordement...

dans la pratique, les nombres sont beaucoup plus grands et il cercles à un grand nombre négatif sur le débordement si l'int est signé, mais ce qui précède est essentiellement ce arriver.

une autre façon de le voir est de le considérer en grande partie comme la même chose qui se produit lorsque l'odomètre de votre voiture se renverse à zéro après avoir atteint 999999 km/mi.

7
répondu Kris 2018-08-01 14:27:00

lorsque vous stockez un entier en mémoire, l'ordinateur le stocke comme une série d'octets. Ceux-ci peuvent être représentées par une série de uns et de zéros.

par exemple, zéro sera représenté comme 00000000 (8 bits entiers), et souvent, 127 sera représenté comme 01111111 . Si vous en ajoutez un à 127, cela "retournerait" les bits, et l'échangerait à 10000000 , mais dans un compliment Standard two représentation, ce est en fait utilisé pour représenter -128. Cela "déborde" la valeur.

avec des numéros non signés , la même chose se produit: 255 ( 11111111 ) plus 1 deviendrait 100000000 , mais comme il n'y a que 8 "bits", cela se termine par 00000000 , qui est 0.

vous pouvez éviter cela en faisant la vérification de gamme appropriée pour votre taille entière correcte, ou en utilisant un langage qui fait la manipulation d'exception appropriée pour vous.

2
répondu Reed Copsey 2010-04-14 23:06:07

une erreur de débordement d'entier se produit quand une opération fait une valeur d'entier supérieure à son maximum.

Par exemple, si la valeur maximale que vous pouvez avoir est de 100000, et votre valeur actuelle est 99999, puis ajouter 2 'débordement'.

vous devriez vous soucier des débordements d'entiers parce que les données peuvent être changées ou perdues par inadvertance, et peut les éviter avec soit un plus grand type d'entier (voir long int dans la plupart des langues) ou avec un schéma qui convertit de longues chaînes de chiffres en très grands nombres entiers.

1
répondu Riddari 2010-04-14 21:50:52

j'aimerais être un peu opposé à toutes les autres réponses jusqu'à présent, qui acceptent d'une façon ou d'une autre les maths merdiques cassées comme données. La question est étiquetée langue-agnostique et dans un grand nombre de langues, entiers ne jamais déborder, donc voici mon genre-de réponse sarcastique:

Qu'est-ce qu'une erreur de débordement d'entier?

un artefact obsolète de l'âge sombre de l'informatique.

pourquoi dois-je faire à ce sujet?

, Non.

comment peut-on l'éviter?

utilisez un langage de programmation moderne dans lequel les entiers ne débordent pas. (Lisp, Scheme, Smalltalk, Auto, Ruby, Novlangue, Ioke, Haskell, faites votre choix ...)

1
répondu Jörg W Mittag 2010-04-14 23:17:27

Dépassement est lorsque le résultat d'une opération arithmétique ne rentre pas dans le type de données de l'opération. Vous pouvez avoir débordement avec un entier non signé de taille byte si vous ajoutez 255 + 1, parce que le résultat (256) ne rentre pas dans les 8 bits d'un octet.

vous pouvez avoir un débordement avec un nombre de virgule flottante si le résultat d'une opération de virgule flottante est trop grand pour représenter dans le type de données de virgule flottante exposant ou mantissa.

vous pouvez ont également underflow avec des types de virgule flottante lorsque le résultat d'une opération de virgule flottante est trop petit à représenter dans le type de donnée de virgule flottante donné. Par exemple, si le type de données à virgule flottante peut traiter des exposants dans la gamme de -100 à +100, et que vous positionnez une valeur avec un exposant de -80, le résultat aura un exposant autour de -160, qui ne correspondra pas au type de données à virgule flottante donné.

Vous devez être préoccupé par les débordements et les sous-écoulements de votre code parce qu'il peut être un tueur silencieux: votre code produit des résultats incorrects mais pourrait ne pas signaler une erreur.

si vous pouvez ignorer les débordements en toute sécurité dépend beaucoup de la nature de votre programme - le rendu des pixels d'écran à partir de données 3D a une tolérance beaucoup plus grande pour les erreurs numériques que, disons, les calculs financiers.

La vérification du débordement de

est souvent désactivée dans les paramètres par défaut du compilateur. Pourquoi? Parce que le code supplémentaire pour vérifier débordement après chaque opération prend du temps et de l'espace, ce qui peut dégrader les performances d'exécution de votre code.

faites-vous une faveur et au moins développez et testez votre code avec vérification de débordement activé.

1
répondu dthorpe 2010-04-14 23:52:35

à Partir de wikipedia :

Dans la programmation informatique, un entier le débordement se produit lorsqu'une opération tente de créer un numérique la valeur qui est plus grande que ce qui peut être représentés au sein de la disponibles l'espace de stockage. Par exemple, ajouter 1 à la plus grande valeur qui peut être représentée constitue un dépassement d'entier. Le conséquence fréquente dans ces cas est pour les moins significatifs représentable bits de le résultat stocké (le résultat est dit envelopper).

vous devriez vous en soucier particulièrement lorsque vous choisissez les types de données appropriés pour votre programme ou vous pourriez obtenir des bogues très subtiles.

0
répondu Darin Dimitrov 2010-04-14 21:49:16

de http://www.first.org/conference/2006/papers/seacord-robert-slides.pdf :

un dépassement d'entier se produit quand un entier est augmenté au-delà de sa valeur maximale ou diminuée au-delà de sa valeur minimale. Les débordements peuvent être signés ou non signés.

P. S.: le PDF a des explications détaillées sur les dépassements et autres conditions d'erreur de nombre entier, et aussi comment aborder / éviter ils.

0
répondu N 1.1 2010-04-14 21:57:02

cela se produit lorsque vous tentez d'utiliser un nombre entier pour une valeur qui est plus élevé que la structure interne du nombre entier peut supporter en raison du nombre d'octets utilisés. Par exemple, si la taille maximale de l'entier est 2,147,483,647 et que vous tentez de stocker 3,000,000,000, vous obtiendrez une erreur de débordement d'entier.

-1
répondu CS. 2010-04-14 21:50:35