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?
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?
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!
Ja, das würde funktionieren ... Danke! – noryb009
Nun, das war einfach, LOL. –
+1 für die Template-Implementierung. Sehr sexy. – chaosTechnician
#include <iostream>
int main(){
unsigned short var = 32767;
var++;
std::cout << var;
std::cin.get();
}
Dies beantwortet die Frage, die gestellt wurde, aber nicht, ich vermute, die Frage, die beabsichtigt war. –
Verwendung 'unsigned short int' oder 'long int'
#include <iostream>
int main(){
long int var = 32767;
var++;
std::cout << var;
std::cin.get();
}
Dann x = 32676; x ++ führt zu x == 32677, nicht 32676. – geoffspear
OK, also wie vermeidet man den Überlauf bei einer vorzeichenlosen 64-Bit-Ganzzahl? – Wizard79
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
Wenn Sie einen anderen Modus wünschen, in dem Integer nicht automatisch umbrechen, existiert es nicht, sorry. – dmazzoni
Das erinnert mich daran, warum ich nicht schlafen kann (http://xkcd.com/571/). :-) –