Unerwartete Ergebnisse durch Ganzzahlüberlauf mit/ohne Vorzeichen
In C kann ein Ganzzahlüberlauf je nach Vorzeichen des Datentyps zu unerwarteten Ergebnissen führen .
Betrachten Sie das folgende Programm:
#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; }
Die Ausgabe von Dieses Programm könnte Sie überraschen:
0 2147483647 -2147483648 0 4294967295 0
Erklärung
Für vorzeichenbehaftete Ganzzahlen ist das Überlaufverhalten undefiniert. In den meisten Implementierungen wird das Zweierkomplement verwendet, was zu unerwartetem Umlaufverhalten führt. Zum Beispiel im obigen Programm:
Für Ganzzahlen ohne Vorzeichen, der Überlauf ist wohldefiniert und umschließt Modulo 2Bits. Mit anderen Worten: Bei Überschreitung des Maximums wird der Wert auf 0 zurückgesetzt. Dies erklärt die Ausgabe für y, wobei y nach dem Überlaufen des maximalen vorzeichenlosen Werts, 4294967295, auf 0 umspringt.
Es ist wichtig zu beachten, dass das Verhalten für einen vorzeichenbehafteten Ganzzahlüberlauf nicht von der Sprache garantiert wird und je nach variieren kann die Implementierung und Maschinenarchitektur. Daher wird im Allgemeinen nicht empfohlen, sich in Ihren Programmen auf ein solches Verhalten zu verlassen.
Das obige ist der detaillierte Inhalt vonWarum führt ein Ganzzahlüberlauf in C zu unterschiedlichen Ergebnissen für vorzeichenbehaftete und vorzeichenlose Ganzzahlen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!