Online C Compiler
Apri nel compilatore

Edizione didattica italiana

Eccezione aritmetica in C

Diagnostica divisioni intere non valide dietro il messaggio floating point exception.

Apri nel compilatore

Eccezione aritmetica in C
Diagnostica divisioni intere non valide dietro il messaggio floating point exception.

Nonostante il nome storico, il messaggio può derivare da una divisione intera per zero senza numeri in virgola mobile. Segnale e codice d’uscita mostrati dipendono da sistema e servizio di esecuzione.

Convalida la lettura e controlla il divisore prima di / o %. Anche una divisione con segno il cui quoziente non è rappresentabile, come minimo diviso -1 nei tipi comuni, è problematica.

Isola gli operandi e verifica i loro intervalli. Distingui le regole degli interi da quelle dei numeri in virgola mobile: cambiare tipo senza capire il calcolo può introdurre un altro errore.

Codice sorgente

#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;
}
Apri nel compilatore

Risultato atteso

=== 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.

Domande frequenti

Perché il codice e alcuni risultati restano in inglese?

Parole chiave C, identificatori, commenti del programma e output attesi restano quelli originali per preservare codice eseguibile e test coerenti. Spiegazioni e istruzioni sono tradotte.