C++ - Vorzeichenlose Ganzzahlen
Habe ich Folgendes Programm geschrieben in C++:
Das problem mit diesem Programm ist, dass, wenn der Benutzer Eingänge einer negativen Zahl, es ist NICHT gefangen von der Linie if(!cin)
. Ich dachte, dass unsigned-Ganzzahlen können NICHT akzeptieren, dass negative zahlen. Warum dann, wenn ich eine negative Zahl eingeben, um die Größe, es ist NICHT gefangen von if(!cin)
und das Programm setzt die Ausführung Fort, ohne Fehlermeldungen?
Ich nicht nutzen kann if(size < 0)
. Ich will zeigen, wie vorzeichenlose Ganzzahlen lösen das problem des negativen input.
- warum nicht
int size;
? - Können Sie nicht, geben Sie die Daten in eine vorzeichenbehaftete Ganzzahl, machen Sie eine Prüfung und dann weisen Sie ihn in eine vorzeichenlose ein?
- Ich bin an einem Projekt arbeiten, die untersuchen, wie bestimmte Sicherheitslücken können gemildert werden. Derzeit bin ich untersucht integer-overflows und gelesen, dass wenn Sie die Programmierung und benötigen Sie nicht negative zahlen, können Sie Gebrauch machen von vorzeichenlosen Ganzzahlen, und das problem ist gelöst.
- Allerdings, wenn ich versuche bei der Eingabe eine negative Zahl im unsigned-integer-Größe, ist es immer noch akzeptiert :s
- Sie verwechseln zwei verschiedene Dinge. Es ist wahr, dass eine Zahl ohne Vorzeichen, können niemals einen negativen Wert. Es ist nicht wahr, dass es eine negative Zahl ist keine gültige externe Repräsentation einer Zahl ohne Vorzeichen. Also da ein 32-bit-Ganzzahl ohne Vorzeichen "-1" gelesen werden, als der Wert 0xFFFFFFFF
- Danke, John. Jetzt verstehe ich. So zahlen ohne Vorzeichen nehmen kann negative zahlen, aber diese werden immer dargestellt als positiv.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Unterschied zwischen unsigned und signed Integer auf den meisten Plattformen wird ein sign-bit ... andere als die, die aktuellen binären Wert ist der gleiche, es ist nur interpretiert zwei verschiedene Möglichkeiten, je nach Zeichen-ness in der Art der binären Wert repräsentiert. So können Sie auf jeden Fall "repräsentieren" ein negativer Wert eingegeben als ein unsigned Wert ... es wird nicht neu interpretiert werden als dieser Wert, aber es kann auf jeden Fall eingegeben werden, der Wert ohne Fehler sein set auf dem stream.
UINT_MAX + 1
abzüglich der "negative" Wert ohne Vorzeichen. Zum Beispiel, wenn der Benutzer die Eingabe-1
, dannUINT_MAX + 1 - 1
wäreUINT_MAX
... soUINT_MAX
ist die binäre Darstellung von-1
in unsignierter form.Kein c++ guru oder so, aber haben Sie versucht, mit
cin.fail()
statt !cin und löschen Sie den Puffer mitcin.clear()
tiefer Erklärung
C und C++ erlauben es Ihnen, weisen Sie einen negativen Wert ein, um ein Objekt von einem vorzeichenlosen Typ. Das Ergebnis ist der ursprüngliche Wert reduziert modulo
2^n
, won
ist die Größe der unsigned-Typ. So zum Beispielunsigned i = -1;
initialisierti
zuUINT_MAX
.Check
if(!cin)
nur darauf hinweisen, dass nichts war zu Lesen, wie das Ende einer Datei.Einer
unsigned
integer nicht Kraft die Eingabe positiv sein; es bedeutet nur, dass der Wert immer interpretiert als positiv (siehe Vorzeichen-bit), die drastische Auswirkungen haben, wenn die Zahl ist in der Tat negativ.Ihre beste Wette ist wahrscheinlich bei der Eingabe eine Ganzzahl und dann testen im code, ob es positiv ist.
Wenn Sie verhindern möchten, dass der Benutzer von der Eingabe von negativen zahlen nehmen Sie die Eingabe als Zahl unterzeichnet und überprüfen, ob es gleich oder größer als null ist.
Den standard, der im Grunde sagt, dass, wenn Sie versuchen, eine Nummer auf einen integralen Typ haben, der außerhalb der Reichweite von der Art, vielfachen der Größenordnung der Typ werden addiert oder subtrahiert, bis der Wert innerhalb des Bereichs.
Es ist einfach so passiert, dass mit den Werten, ausgedrückt als 2-s ergänzen und in den Bereichen von signed-und unsigned int-Werten, das bedeutet, dass genau die gleiche bit-Muster zugeordnet wird, auf einen beliebigen Wert. Negativ hat man ein bit-Muster von nur Einsen, übersetzt der höchste mögliche Wert für unsigned int und ist gleichbedeutend mit
-1 + 232
oder den ursprünglichen Wert plus die Größe eines unsigned int.Oder Sie könnten einfach eine größere unterzeichnet integral-Typ.