Ganzzahlüberlauf in GCC auf x86 verstehen
Problem:
Der bereitgestellte Code gibt einen ein Endlosschleife auf GCC beim Versuch eines Ganzzahlüberlaufs mit einem x86 Architektur:
int i = 0x10000000; while (i > 0) { i += i; }
Grund:
Integer-Überlauf in GCC auf x86 ist ein undefiniertes Verhalten und das beobachtete Verhalten kann variieren. GCC implementiert Integer-Arithmetik normalerweise mithilfe von x86-Integer-Anweisungen, die normalerweise bei Überlauf umgebrochen werden. In diesem Fall geht der Compiler jedoch davon aus, dass der Überlauf nicht beabsichtigt ist, und führt Optimierungen durch, die zu einer Endlosschleife führen.
Lösung:
Um das Wrap-Around-Verhalten sicherzustellen , ist eine explizite Überlaufkontrolle erforderlich. Dies kann erreicht werden durch:
Alternative Implementierungen:
Code-Erklärung:
Der Assembler-Code der problematischen Schleife zeigt, dass der Compiler den Schleifentest basierend auf der Annahme, dass ein Überlauf nicht auftritt, wegoptimiert geschehen. Dadurch wird die Schleife auf unbestimmte Zeit fortgesetzt.
Das obige ist der detaillierte Inhalt vonWarum führt dieser ganzzahlige Überlaufcode zu einer Endlosschleife in GCC auf x86?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!