2010-06-14 18 views
5

Dans le code C++ suivant, 32767 + 1 = -32768.Comment éviter le débordement d'entier?

#include <iostream> 
int main(){ 
short var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 

Y at-il un moyen de laisser simplement "var" comme 32767, sans erreurs?

+0

Avez-vous ce qui se passe ici? Vous avez atteint le plafond pour un nombre entier (court), donc en ajouter un de plus retourne les signes à la quantité négative maximale pour un nombre entier. – blu

+0

Si vous voulez un mode différent où les entiers ne se recouvrent pas automatiquement, cela n'existe pas, désolé. – dmazzoni

+4

Cela me rappelle pourquoi je [ne peux pas dormir] (http://xkcd.com/571/). :-) –

Répondre

29

Oui, il y a:

if (var < 32767) var++; 

Par ailleurs, vous ne devriez pas hardcode la constante, utilisez numeric_limits<short>::max() défini dans <limits> fichier d'en-tête à la place.

Vous pouvez encapsuler cette fonctionnalité dans un modèle de fonction:

template <class T> 
void increment_without_wraparound(T& value) { 
    if (value < numeric_limits<T>::max()) 
    value++; 
} 

et de l'utiliser comme:

short var = 32767; 
increment_without_wraparound(var); // pick a shorter name! 
+0

Oui, ça marcherait ... Merci! – noryb009

+0

Eh bien c'était facile, LOL. –

+2

+1 pour l'implémentation du modèle. Très sexy – chaosTechnician

0
#include <iostream> 
int main(){ 
unsigned short var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 
+1

Cela répond à la question qui a été posée, mais pas, je suppose, à la question qui était prévue. –

0

utilisation unsigned short int 'ou 'long int'

#include <iostream> 
int main(){ 
long int var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 
+0

Puis x = 32676; OK, entraînera x == 32677, pas 32676. – geoffspear

+1

OK, alors comment éviter le débordement sur un entier non signé de 64 bits? – Wizard79