Ist ein Overflow möglich - C?

2 Antworten

(signed) int umfasst den Bereich von 0 bis -32768 bis 32767. Solange nicht ausdrücklich in den Compilereinstellungen anders festgelegt ist int ein signed int.

Zuerst testest Du, ob die eingegebenen Zahlen im Bereich liegen.

Ein Überlauf bei der Addition von int-Werten ergibt sich, wenn die Summe größer als 32767 oder kleiner als -32768 ist. Deklariere einfach eine Variable als long und weise ihr das Ergebnis der Addition zu. Dann überprüfst Du, ob der Wert dieser Variablen größer als 32767 oder kleiner als -32768 ist. Wenn ja, dann ist das der gesuchte Überlauf. Wenn nein, dann lass die Funktion das Ergebnis zurückgeben.

Bein unsigned int ist der Bereich von 0 bis 65535.

Du kannst die Addition also einfach mit einem long als Ergebnistyp durchführen und erst danach überprüfen, ob das Ergebnis im zulässigen Bereich liegt.

Heyy

Dein Ansatz zur Überlaufserkennung in C sieht schon gut aus, aber es gibt noch ein paar Dinge, die du verbessern könntest, um wirklich alle Fälle abzudecken.

Dein Code prüft nur auf Überläufe bei rein positiven oder rein negativen Zahlen. Es fehlen aber Fälle, bei denen ein Wert nahe INT_MAX oder INT_MIN liegt, zum Beispiel bei -1 und INT_MIN. Da kann es ebenfalls zu einem Überlauf kommen.

Hab den Code mal verbessert:

#include <stdio.h>
#include <limits.h>

int overflowDetect(int x, int y) {
    // Überlaufprüfung bei positiven Werten
    if (x > 0 && y > 0 && (x > INT_MAX - y)) {
        return -1; // Überlauf erkannt
    }
    
    // Überlaufprüfung bei negativen Werten
    if (x < 0 && y < 0 && (x < INT_MIN - y)) {
        return -1; // Überlauf erkannt
    }

    // Wenn kein Überlauf, gib die Summe zurück
    return x + y;
}

int main() {
    int result = overflowDetect(-1, INT_MIN);
    
    if (result == -1) {
        printf("Überlauf erkannt!\n");
    } else {
        printf("Ergebnis: %d\n", result);
    }
    
    return 0;
}
Woher ich das weiß:Hobby

PsySkill 
Beitragsersteller
 09.10.2024, 21:36

Genau das gleiche gibt mir ChatGPT zurück. Nun ist es so, dass overflowDetect(-1,MIN_INT); erkannt wird. Daher gehe ich mal davon aus, dass du die Antwort lediglich von ChatGPT kopiert hast.

carolinzzz  09.10.2024, 22:14
@PsySkill

Und eigentlich hat das bisher immer bei mir einwandfrei funktioniert

PsySkill 
Beitragsersteller
 09.10.2024, 22:43
@carolinzzz

Ja klar, allerdings kann ich auch gut selber einen Chatbot nutzen. Ich habe mich aber ganz klar dagegen entscheiden, weil KI viel weiß aber schlecht in entsprechenden Denkstrukturen ist, welche für die Beantwortung dieser Frage benötigt werden.