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?
Antwort
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.
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
... 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
- 1. Ein Objekt erstellen, das außerhalb des Bereichs verwendet werden soll
- 2. Problem mit der Übergabe eines Werts an das Date-Objekt
- 3. C# Array außerhalb des Bereichs
- 4. Index ist außerhalb des Bereichs
- 5. Warnung - Integer Operationsergebnis ist in c außerhalb des zulässigen Bereichs
- 6. pyAudioAnalysis, Tupelindex außerhalb des Bereichs
- 7. Negative ArraySlice: Index ist außerhalb des Bereichs
- 8. Warum ist mein Code nicht außerhalb des zulässigen Bereichs?
- 9. Python datetime fromtimestamp Ergebnis valueerror Jahr außerhalb des Bereichs
- 10. Für Schleife außerhalb des Bereichs
- 11. Zuweisung eines vlookup-Werts zu einer Variablen
- 12. VBA außerhalb des Bereichs
- 13. Integer außerhalb des Bereichs
- 14. Listenindex außerhalb des Bereichs
- 15. C++ String-Index außerhalb des Bereichs
- 16. Index von 3 ist außerhalb des Bereichs
- 17. Vektor Index außerhalb des Bereichs bei der Konvertierung eines char
- 18. Index außerhalb des zulässigen Bereichs Ausnahme - C#
- 19. Gurobi & C#: Index außerhalb des Bereichs
- 20. Unity3D: Array außerhalb des Bereichs
- 21. Zuweisen eines Werts zu einem dynamischen Array-Element führt zu einem Index außerhalb des Bereichs Fehler
- 22. IndexError: Listenindex außerhalb des Bereichs (in Abfrageergebnissen)
- 23. C++ Random Access Iterator außerhalb des Bereichs
- 24. Außerhalb des Bereichs index this.buf.utf8Slice
- 25. tf.nn.in_top_k: Ziele außerhalb des Bereichs
- 26. Incrementing Iterator außerhalb des Bereichs
- 27. Array ist außerhalb des Bereichs .. Irgendeine Lösung?
- 28. Python Fehlerliste Index ist außerhalb des Bereichs
- 29. ValueError: Jahr ist außerhalb des Bereichs pyplot
- 30. IOS/Objective-C: Außerhalb des Bereichs Fehler mit NSPredate
Wie würden Sie 'signed' Integer Overflow definieren? Was ist das Ergebnis von 'INT_MAX + 1'? – mch