Que signifient les débordements et débordements arithmétiques dans la programmation C?
Débordement
De http://en.wikipedia.org/wiki/Arithmetic_overflow :
la condition qui se produit lorsqu'un calcul produit un résultat d'une amplitude supérieure à celle qu'un registre ou un emplacement de stockage donné peut stocker ou représenter.
Ainsi, par exemple:
uint32_t x = 1UL << 31;
x *= 2; // Overflow!
Notez que comme @R le mentionne dans un commentaire ci-dessous, la norme C suggère:
Un calcul impliquant des opérandes non signés ne peut jamais déborder, car un résultat qui ne peut pas être représenté par le type entier non signé résultant est réduit modulo le nombre qui est supérieur à la plus grande valeur qui peut être représentée par le type résultant.
Bien sûr, il s'agit d'une définition assez idiosyncrasique du "débordement". La plupart des gens qualifieraient la réduction modulo (c'est-à-dire de bouclage) de "débordement".
Débordement
De http://en.wikipedia.org/wiki/Arithmetic_underflow :
la condition dans un programme informatique qui peut se produire lorsque le résultat réel d'une opération en virgule flottante est plus petit (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.
Ainsi, par exemple:
float x = 1e-30;
x /= 1e20; // Underflow!
Les ordinateurs n'utilisent que 0 et 1 pour représenter les données afin que la plage de valeurs pouvant être représentées soit limitée. De nombreux ordinateurs utilisent 32 bits pour stocker des entiers, donc le plus grand entier non signé qui peut être stocké dans ce cas est 2 ^ 32 -1 = 4294967295. Mais le premier bit est utilisé pour représenter le signe, donc, en fait, la plus grande valeur est 2 ^ 31 - 1 = 2147483647.
La situation où un entier en dehors de la plage autorisée nécessite plus de bits que ce qui peut être stocké est appelée un débordement.
De même, avec des nombres réels, un exposant trop petit pour être stocké provoque un dépassement de capacité.