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 - 1
et INT_MAX + 1
. Dans les deux cas, il n'y a tout simplement pas assez d'espace dans le int
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.
INT_MIN - 1
ou nonINT_MAX + 1