2010-06-14 11 views
5

Im folgenden C++ - Code 32767 + 1 = -32768.Wie vermeidet man einen Integer-Überlauf?

Gibt es eine Möglichkeit, "var" einfach wie 32767, ohne Fehler zu verlassen?

+0

Verstehst du, was hier los ist? Sie haben die Obergrenze für eine Ganzzahl (kurz) erreicht. Wenn Sie also eine weitere Zahl hinzufügen, wird die Zahl auf den maximalen negativen Wert für eine Ganzzahl gesetzt. – blu

+0

Wenn Sie einen anderen Modus wünschen, in dem Integer nicht automatisch umbrechen, existiert es nicht, sorry. – dmazzoni

+4

Das erinnert mich daran, warum ich nicht schlafen kann (http://xkcd.com/571/). :-) –

Antwort

29

Ja, es gibt:

if (var < 32767) var++; 

By the way, sollten Sie nicht die Konstante codieren, verwenden numeric_limits<short>::max() stattdessen in <limits> Header-Datei definiert.

Sie diese Funktionalität in einer Funktionsvorlage verkapseln können:

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

und verwenden Sie es mögen:

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

Ja, das würde funktionieren ... Danke! – noryb009

+0

Nun, das war einfach, LOL. –

+2

+1 für die Template-Implementierung. Sehr sexy. – chaosTechnician

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

Dies beantwortet die Frage, die gestellt wurde, aber nicht, ich vermute, die Frage, die beabsichtigt war. –

0

Verwendung 'unsigned short int' oder 'long int'

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

Dann x = 32676; x ++ führt zu x == 32677, nicht 32676. – geoffspear

+1

OK, also wie vermeidet man den Überlauf bei einer vorzeichenlosen 64-Bit-Ganzzahl? – Wizard79

Verwandte Themen