Online C Compiler
Im Compiler öffnen

Deutsche Lernausgabe

Arithmetische Ausnahme in C

Untersuchen Sie ungültige Ganzzahldivisionen hinter der Meldung „floating point exception“.

Im Compiler öffnen

Arithmetische Ausnahme in C
Untersuchen Sie ungültige Ganzzahldivisionen hinter der Meldung „floating point exception“.

Trotz ihres historischen Namens kann diese Meldung durch eine Ganzzahldivision durch null entstehen, ganz ohne Gleitkommazahlen. Das angezeigte Signal und der Rückgabecode hängen vom System und Ausführungsdienst ab.

Prüfen Sie das erfolgreiche Einlesen und kontrollieren Sie den Divisor vor / oder %. Problematisch ist auch eine vorzeichenbehaftete Division mit nicht darstellbarem Quotienten, etwa der Minimalwert geteilt durch -1 bei üblichen Typen.

Isolieren Sie die Operanden der fehlerhaften Operation und prüfen Sie ihre Wertebereiche. Unterscheiden Sie Ganzzahlregeln von Gleitkommaregeln; ein Typwechsel ohne Verständnis der Rechnung kann einen weiteren Fehler verursachen.

Quellcode

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

int safe_divide(int a, int b, int *out_result) {
    if (b == 0) {
        return -1; // Error: division by zero
    }
    // Protect against INT_MIN / -1 signed overflow
    if (a == INT_MIN && b == -1) {
        return -2; // Error: signed integer overflow
    }
    *out_result = a / b;
    return 0; // Success
}

int main(void) {
    printf("=== Safe Integer Division Demo ===\n");

    int test_cases[][2] = {
        {100, 5},
        {100, 0},
        {INT_MIN, -1},
        {42, 7}
    };

    int num_tests = sizeof(test_cases) / sizeof(test_cases[0]);
    for (int i = 0; i < num_tests; i++) {
        int a = test_cases[i][0];
        int b = test_cases[i][1];
        int result = 0;

        int status = safe_divide(a, b, &result);
        if (status == 0) {
            printf("[OK] %d / %d = %d\n", a, b, result);
        } else if (status == -1) {
            printf("[GUARDED] Division by zero rejected for %d / %d\n", a, b);
        } else if (status == -2) {
            printf("[GUARDED] INT_MIN / -1 overflow rejected for %d / %d\n", a, b);
        }
    }

    printf("All divisions validated safely without SIGFPE crashes.\n");
    return 0;
}
Im Compiler öffnen

Erwartetes Ergebnis

=== Safe Integer Division Demo ===
[OK] 100 / 5 = 20
[GUARDED] Division by zero rejected for 100 / 0
[GUARDED] INT_MIN / -1 overflow rejected for -2147483648 / -1
[OK] 42 / 7 = 6
All divisions validated safely without SIGFPE crashes.

Häufige Fragen

Warum bleiben Code und manche Ausgaben englisch?

C-Schlüsselwörter, Bezeichner, Programmkommentare und erwartete Ausgaben bleiben wie im Original, damit der Code ausführbar und die Tests konsistent bleiben. Erklärungen und Aufgabenstellungen sind übersetzt.