Comment vérifier le dépassement d’entier en C?

Dupliquer possible:
Meilleure façon de détecter le dépassement d’entier en C / C ++

Il y a (1):

// assume x,y are non-negative if(x > max - y) error; 

Et (2):

 // assume x,y are non-negative int sum = x + y; if(sum < x || sum < y) error; 

Lequel est préféré ou est-il un meilleur moyen.

Le dépassement d’entier est l’exemple canonique du “comportement indéfini” en C (notant que les opérations sur les entiers non signés ne dépassent jamais, elles sont définies pour être bouclées à la place). Cela signifie qu’une fois que vous avez exécuté x + y , s’il déborde, vous êtes déjà arrosé. Il est trop tard pour procéder à une vérification – votre programme aurait peut-être déjà échoué. Voyez cela comme une vérification de division par zéro – si vous attendez que la division ait été exécutée pour vérifier, il est déjà trop tard.

Cela implique donc que la méthode (1) est la seule façon correcte de le faire. Pour max , vous pouvez utiliser INT_MAX partir de .

Si x et / ou y peuvent être négatifs, les choses se compliquent. Vous devez faire le test de telle sorte que le test lui-même ne puisse pas causer de débordement.

 if ((y > 0 && x > INT_MAX - y) || (y < 0 && x < INT_MIN - y)) { /* Oh no, overflow */ } else { sum = x + y; } 

Vous ne pouvez vraiment vérifier le débordement qu’avec unsigned entiers unsigned et arithmatiques:

 unsigned a,b,c; a = b + c; if (a < b) { /* overflow */ } 

Le comportement du débordement avec des entiers signés n’est pas défini en C, mais vous pouvez utiliser la plupart des machines.

 int a,b,c; a = b + c; if (c < 0 ? a > b : a < b) { /* overflow */ } 

Cela ne fonctionnera pas sur les machines qui utilisent n'importe quel type d'arithmétique saturant

Vous n’avez qu’à en vérifier un. Si x + y déborde, il sera inférieur à x et y. Par conséquent:

 int sum = x + y; if (sum < x) error; 

devrait être suffisant.

Le site suivant contient de nombreuses informations sur le dépassement d'entier:

http://www.fefe.de/intof.html

Si vous voulez gérer les nombres négatifs, vous pouvez le développer:

 int sum = x + y; if (y >= 0) { if (sum < x) error; } else { if (sum > x) error; }