Heim > Backend-Entwicklung > C++ > Hauptteil

Warum führt ein Ganzzahlüberlauf in C zu unerwarteten Ergebnissen?

DDD
Freigeben: 2024-11-12 16:47:01
Original
174 Leute haben es durchsucht

Why Does Integer Overflow Produce Unexpected Results in C  ?

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;
}
Nach dem Login kopieren

Die Ausgabe ist überraschend:

0
2147483647
-2147483648

0
4294967295
0
Nach dem Login kopieren

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
Nach dem Login kopieren

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:

  • POS_MAX (maximaler positiver Wert) = 7 (0111)
  • NEG_MAX (maximaler negativer Wert) = -8 (1000)

Beim Addieren von 1 zu POS_MAX:

0111 + 1 = 1000
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage