2017-04-11 9 views
3

schreiben I den folgenden Code:Ganze Zahl ohne Vorzeichen in C++

#include <iostream> 
using namespace std; 
int main() { 

    unsigned int i=1; 
    i=i-3; 
    cout<<i; 
    return 0; 
} 

Der Ausgang ist ein Garbage-Wert, was verständlich ist.
Jetzt schreibe ich den folgenden Code:

#include <iostream> 
    using namespace std; 
    int main() { 

    unsigned int i=1; 
    i=i-3; 
    i=i+5; 
    cout<<i; 
    return 0; 
} 

Jetzt ist die Ausgabe 3. Was ist denn hier passiert? Wie wird der Müllwert hier um 5 addiert?

+12

es ist nicht Müll, der Wert unterläuft rund um unsigned int max Wert - 2, Sie haben dann 5 hinzugefügt, so dass es positiv wird 3 – EdChum

+1

Nachschlagen: https://en.wikipedia.org/wiki/Two%27s_complement – Meccano

+0

Vorzeichenlose Ganzzahlen überlaufen in wohldefinierter Weise (im Gegensatz zu Ganzzahlen mit Vorzeichen). In Verbindung stehende Fragen: http://stackoverflow.com/questions/16056758/cc-unsigned-integer-overflow, http://stackoverflow.com/questions/9193880/overflowing-of-unsigned-int –

Antwort

6

Denken Sie an die Werte von unsigned int, die auf einem großen Zifferblatt gezeichnet werden, wobei der größtmögliche Wert (UINT_MAX) gleich Null ist.

Wenn Sie 3 von 1 subtrahieren, werden 3 Stellen zurück auf die Uhr gebracht (was UINT_MAX - 1 ergibt). Wenn Sie 5 addieren, werden Sie 5 Plätze nach vorne verschoben.

Der Nettoeffekt besteht darin, 2 zu 1 hinzuzufügen, aber es ist wichtig zu wissen, dass der Zwischenwert Wert perfekt durch den C++ - Standard definiert ist. Es ist nicht Müll, aber im Zusammenhang mit dem Wert von UINT_MAX auf Ihrer Plattform.

Beachten Sie, dass die genaue Art dieses Überlaufs nicht für signed Typen gilt. Das Verhalten beim Überlaufen eines signed-Typs ist undefined in C++.

+0

Sollte ich den Unterschied zwischen 0 betrachten und INT_MAX 1? – metasj

+1

Meinten Sie UINT_MAX? Wenn ja, dann betrachte den Unterschied zwischen 0 und UINT_MAX als -1. Sie sind dann mit vorzeichenloser Arithmetik konsistent. Das Zuweisen eines Werts von "-1" zu einem "vorzeichenlosen" Typ wird definiert, um UINT_MAX zu erhalten. – Bathsheba

+0

Ja UINT_MAX. Ich habe 1 als den absoluten Unterschied zwischen 0 und UINT_MAX bezeichnet. Es ist jetzt klar. – metasj

Verwandte Themen