Ist ein Overflow möglich - C?
#include <stdio.h>
#include <limits.h>
int overflowDetect(int x, int y){
int imax = INT_MAX;
// Bei negativen Eingaben
if((x < 0) && (y < 0)){
if((x+y) > 0) return(-01);
}
// Bei Positiven Eingaben
if((x > 0) && (y > 0)){
if((x+y) < 0) return(-01);
}
return(x+y);
}
int main(){
printf("%d\n",overflowDetect(-1,INT_MIN));
return 0;
}
Die Aufgabe war "Schreiben Sie ein C Programm, das den Überlauf von Additionen von zwei int Werten erkennt und bei Überlauf mit Fehler beendet und andernfalls die Operation ausführt und das Ergebnis ausgibt."
Findet jemand noch eine Möglichkeit die ich nicht gefunden habe, einen Überlauf zu verursachen?
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;
}
Und eigentlich hat das bisher immer bei mir einwandfrei funktioniert
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.
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.