INT_MIN-1 est-il un débordement ou un débordement?

10

Il me semble que je lisais que

  • underflowsignifie que vous avez une magnitude trop petite qui ne peut plus être présentée dans un type
  • overflowsignifie que vous avez une magnitude trop grande qui ne peut plus être présentée dans un type

Cependant, dans la pratique, je perçois que les termes sont utilisés de

  • underflowsignifie que vous avez une valeur trop petite qui ne peut plus être présentée dans un type
  • overflowsignifie que vous avez une valeur trop grande qui ne peut plus être présentée dans un type

Quelle est la bonne signification à utiliser ici? Les termes sont-ils définis différemment pour les types entiers et à virgule flottante?

Johannes Schaub - litb
la source
2
Généralement, le terme "underflow" semble être réservé à l'arithmétique à virgule flottante. Avec des nombres entiers, je dis généralement "débordement", que ce soit INT_MIN - 1ou nonINT_MAX + 1
Charles Salvia

Réponses:

15

Je ne peux pas vraiment trouver une source "faisant autorité" à ce sujet, principalement parce que c'est probablement une question de convention, et la terminologie est souvent très incohérente. Mais, l'extrait suivant du " Codage sécurisé en C et C ++ " de Robert Seacord résume ma compréhension de la situation:

Un débordement d'entier se produit lorsqu'un entier est augmenté au-delà de sa valeur maximale ou diminué au-delà de sa valeur minimale 3 . Les débordements entiers sont étroitement liés à la représentation sous-jacente.

La note de bas de page poursuit:

[3] un nombre entier décroissant au - delà de sa valeur minimale est souvent désigné comme un nombre entier de sousverse , bien que techniquement ce terme se réfère à une condition de virgule flottante.

La raison pour laquelle nous l'appelons un débordement d' entier est qu'il n'y a tout simplement pas assez d' espace disponible dans le type pour représenter la valeur. En ce sens, il est similaire à un débordement de tampon (sauf qu'au lieu de franchir réellement la limite du tampon, il présente généralement un comportement de bouclage. *) De ce point de vue, il n'y a pas de différence conceptuelle entre INT_MIN - 1et INT_MAX + 1. Dans les deux cas, il n'y a tout simplement pas assez d'espace dans le inttype de données pour représenter l'une ou l'autre valeur - nous avons donc un débordement .

Il peut également être utile de noter que dans les architectures de processeur x86 et x86_64, le registre des indicateurs comprend un bit de débordement . Le bit de dépassement est défini lorsqu'une opération arithmétique d'entier signé déborde. L'expression INT_MIN - 1définira le bit de débordement. (Il n'y a pas de bit "underflow".) Il est donc clair que les ingénieurs d'AMD et d'Intel utilisent le terme "overflow" pour décrire le résultat d'une opération arithmétique entière qui a trop de bits pour tenir dans le type de données, que le la valeur est numériquement trop grande ou trop petite.


* En fait, en C, le débordement d'entier signé est en fait un comportement indéfini, mais dans d'autres langages comme Java, l'arithmétique du complément à deux s'enroulera.

Charles Salvia
la source
6

C'est un débordement. Un sous-dépassement ne se produit pas pour les valeurs entières.

Un débordement se produit lorsqu'une valeur est trop grande (trop éloignée de zéro) pour être représentée par le type spécifique, et un underflwo est lorsqu'elle est trop petite (trop proche de zéro).

Comme les valeurs entières les plus proches de zéro (1 et -1) peuvent toujours être représentées par n'importe quelle variable entière (en supposant un entier signé avec plus d'un bit), un dépassement de capacité ne peut pas se produire.

L' article de Wikipedia sur underflow a une description assez claire:

"Le terme dépassement arithmétique (ou" dépassement à virgule flottante ", ou simplement" dépassement ") est une condition dans un programme informatique qui peut se produire lorsque le résultat réel d'une opération à virgule flottante est de plus petite amplitude (c'est-à-dire plus proche de zéro) que la plus petite valeur représentable sous la forme d'un nombre à virgule flottante normal dans le type de données cible. Le sous-dépassement peut en partie être considéré comme un débordement négatif de l'exposant de la valeur à virgule flottante. "

Guffa
la source
Il peut être utile de noter qu'il underflowest souvent utilisé spécifiquement pour désigner la condition particulière où la magnitude d'un nombre est inférieure à celle de la plus petite valeur non nulle possible, mais plus grande que la plus petite distance possible entre des valeurs non nulles - dans d'autres des mots, des cas où les chiffres tombent dans ce que l'article du Wiki appelle "l'écart de sous-flux". Sur les implémentations conformes IEEE-744, le plus petit nombre représentable est égal à la plus petite différence représentable entre les nombres, de sorte que de tels débordements ne peuvent pas se produire, mais en dehors du monde PC, tous les systèmes ne sont pas conformes IEEE.
supercat
2

En mathématiques entières, le débordement fait référence à des valeurs trop grandes et trop petites. En virgule flottante, le débordement fait référence à un exposant trop grand et le débordement fait référence à un exposant trop petit.

En fait, pour les types entiers , les processeurs n'ont aucun moyen de faire la différence entre le débordement et le sous-dépassement. Prenez l'ajout 16 bits suivant:

  0x8000 (unsigned 32768, or signed -32767)
+ 0xFFFF (unsigned 65535, or signed -1)
--------
  0x7FFF (32767, the carried '1' is lost)

Le drapeau de débordement dans le CPU serait, bien sûr, défini après cet ajout. En utilisant des mathématiques signées, le résultat est trop petit (-32768). En utilisant des mathématiques non signées, le résultat est trop grand (0x17FFF). Étant donné que le calcul du complément de 2 est identique pour les types signés et non signés, overflowest forcé de signifier à la fois des valeurs trop grandes et trop petites.

Note à soi - pense à un nom
la source