Verstehen des Ganzzahlüberlaufs mit/ohne Vorzeichen
Beim Erlernen des Ganzzahlüberlaufs in C stellten sich die folgenden Fragen:
Warum erhalte ich diese Ergebnisse mit vorzeichenbehaftetem/unsigniertem Ganzzahlüberlauf?
Erklärung:
#include <iostream> int main() { int x(0); std::cout << x << std::endl; x = x + 2147483647; std::cout << x << std::endl; x = x + 1; std::cout << x << std::endl; std::cout << std::endl; unsigned int y(0); std::cout << y << std::endl; y = y + 4294967295; std::cout << y << std::endl; y = y + 1; std::cout << y << std::endl; }
Das Verständnis des Ganzzahlüberlaufs in C erfordert ein Verständnis von vorzeichenbehafteten und vorzeichenlosen Ganzzahltypen.
0 2147483647 -2147483648 0 4294967295 0
Vorzeichenbehafteter Ganzzahlüberlauf wird als
undefiniertes Verhalten
betrachtet, was bedeutet, dass der Compiler nicht das genaue Verhalten angeben muss, wenn eine vorzeichenbehaftete Ganzzahl überläuft. In der Praxis speichern die meisten Implementierungen vorzeichenbehaftete Ganzzahlen unter Verwendung der 2er-Komplementdarstellung. Dies bedeutet, dass bei einem Überlauf einer vorzeichenbehafteten Ganzzahl der Wert in den negativen Bereich verschoben wird. Im Beispiel wird 1 zur maximalen positiven Ganzzahl (2147483647) mit Vorzeichen addiert Ganzzahl ergibt -2147483648, die minimale negative Ganzzahl.Im Gegensatz dazu ist vorzeichenloser Ganzzahlüberlauf gut -definiert
, wobei der Wert auf Null umspringt, wenn er den Maximalwert überschreitet. Im Beispiel ergibt die Addition von 1 zur maximalen vorzeichenlosen Ganzzahl (4294967295) 0. Dies liegt daran, dass vorzeichenlose Ganzzahlen kein Konzept für negative Werte haben.Das obige ist der detaillierte Inhalt vonWarum führt ein Ganzzahlüberlauf zu einem unterschiedlichen Verhalten für vorzeichenbehaftete und vorzeichenlose Ganzzahlen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!