Heim > Backend-Entwicklung > C++ > Hauptteil

Warum führt ein Ganzzahlüberlauf in C zu unterschiedlichen Ergebnissen für vorzeichenbehaftete und vorzeichenlose Ganzzahlen?

Patricia Arquette
Freigeben: 2024-11-12 01:37:03
Original
737 Leute haben es durchsucht

Why does integer overflow in C   lead to different results for signed and unsigned integers?

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

Die Ausgabe von Dieses Programm könnte Sie überraschen:

0
2147483647
-2147483648

0
4294967295
0
Nach dem Login kopieren

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:

  • x wird auf 0 initialisiert und läuft dann auf seinen maximalen positiven Wert, 2147483647, über.
  • Wenn 1 zu diesem übergelaufenen Wert addiert wird, wird ein Umbruch durchgeführt um seinen minimalen negativen Wert, -2147483648.

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage