Unerwartete Ergebnisse mit Integer-Überlauf in C
Bei der Arbeit mit Integer-Typen ist es wichtig, die Auswirkungen des Überlaufs zu verstehen. In diesem Beitrag untersuchen wir, warum vorzeichenbehaftete und vorzeichenlose Ganzzahlüberläufe in einem C-Programm zu unerwarteten Ergebnissen führen.
Betrachten Sie das folgende Programm, das Ganzzahlüberläufe testet:
#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 ist überraschend:
0 2147483647 -2147483648 0 4294967295 0
Vorzeichenbehafteter Ganzzahlüberlauf
Vorzeichenbehafteter Ganzzahlüberlauf ist ein undefiniertes Verhalten. Das bedeutet, dass der Compiler alles tun kann, was er will, einschließlich der Erzeugung eines falschen Ergebnisses wie in diesem Fall.
Unsigned Integer Overflow
Im Gegensatz dazu ist ein Unsigned Integer Overflow gut -definiert. Der Wert wird umgebrochen, ähnlich einer Modulo-Division durch 2^Bits (wobei Bits die Anzahl der Bits im Datentyp ist). Da wir ein 32-Bit-Int haben:
4294967295 + 1 = 4294967296 % 2^32 = 0
Spezifische Implementierungsdetails
Auch wenn ein vorzeichenbehafteter Ganzzahlüberlauf ein undefiniertes Verhalten ist, verwenden die meisten Implementierungen die Zweierkomplementdarstellung. Dies erklärt die spezifischen Ergebnisse, die in diesem Programm beobachtet wurden:
Beim Addieren von 1 zu POS_MAX:
0111 + 1 = 1000
Da das führende Bit gesetzt ist, handelt es sich um eine negative Zahl. Um den tatsächlichen Wert zu ermitteln, führen wir die 2er-Komplement-Umkehrung durch:
1000 - 1 = 0111 ~0111 = 1000 = -8
Somit ist der Endwert -8, der in der Ausgabe des Programms erscheint.
Das obige ist der detaillierte Inhalt vonWarum führt ein Ganzzahlüberlauf in C zu unerwarteten Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!