2017-03-13 1 views
0

Wenn wir einem Objekt vom Typ unsigned einen Wert außerhalb des Bereichs zuweisen, ist das Ergebnis der Rest des Wertes modulo die Anzahl der Werte, die der Zieltyp enthalten kann. Das ist natürlich. Wenn wir jedoch einem Objekt vom Typ signed einen Wert außerhalb des Bereichs zuweisen, lautet das Ergebnis undefined. Warum definiert der C++ - Standard kein genaues Ergebnis dieses Verhaltens, wie zB unsigned?Warum ist das Ergebnis der Zuweisung eines Werts außerhalb des Bereichs an ein Objekt mit Vorzeichen in C++ undefiniert?

+0

Wie würden Sie 'signed' Integer Overflow definieren? Was ist das Ergebnis von 'INT_MAX + 1'? – mch

Antwort

1

Da einige Prozessoren eine Hardware-Ausnahme beim arithmetischen Umsturz erzeugen. Um das Verhalten zu definieren, müsste der C++ - Code eine Trap zwischen fast allen alu-Anweisungen einfügen und das Programm verlangsamen.

+0

In C wird das Verhalten des Zuweisens eines * existierenden * Ganzzahlwerts zu einem signierten Typ, der zu klein ist, um ihn zu halten, entweder als Speichern eines implementierungsdefinierten Werts oder Erhöhen eines implementierungsdefinierten Signals definiert. Ich kenne keine Nicht-Zweierkomplement-Systeme, die einen 64-Bit-Integer-Typ ohne Vorzeichen unterstützen (wie von den aktuellen Standards für C und C++ gefordert), weshalb ich denke, dass das Vermeiden von Traps kein Problem darstellt. Andererseits könnte es für einige Anwendungen nützlich sein, den Überlauf abzufangen, aber es Compiler-Autoren zu erlauben, ihre eigenen Entscheidungen zu treffen, um zu entscheiden, welche Form von Traps nützlich wäre ... – supercat

+0

... macht mehr Sinn, als das Standard Committee vermuten zu lassen Dinge. Während "Undefined Behaviour" früher so interpretiert wurde, als ob "Verhalten in welcher Form auch immer eine Implementierung am geeignetsten für den beabsichtigten Zweck" wäre, hätten die Autoren des Standards * gesagt * so herablassend angedeutet, dass sie Compiler-Schreiber erwarten würden andernfalls implementieren Verhaltensweisen, die für ihre beabsichtigten Zwecke ungeeignet sind] Compiler-Schreiber scheinen anzunehmen, dass die Eignung eines Compilers für einen bestimmten Zweck von nichts anderem als der Konformität mit dem Standard abhängen sollte. – supercat

Verwandte Themen