Il me semble que je lisais que
underflow
signifie que vous avez une magnitude trop petite qui ne peut plus être présentée dans un typeoverflow
signifie 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
underflow
signifie que vous avez une valeur trop petite qui ne peut plus être présentée dans un typeoverflow
signifie 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?
terminology
Johannes Schaub - litb
la source
la source
INT_MIN - 1
ou nonINT_MAX + 1
Réponses:
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:
La note de bas de page poursuit:
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 - 1
etINT_MAX + 1
. Dans les deux cas, il n'y a tout simplement pas assez d'espace dans leint
type 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 - 1
dé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.
la source
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:
la source
underflow
est 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.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:
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,
overflow
est forcé de signifier à la fois des valeurs trop grandes et trop petites.la source