Online C Compiler
Openen in de compiler

Nederlandse leereditie

Rekenkundige uitzondering in C

Onderzoek ongeldige gehele delingen achter de melding floating point exception.

Openen in de compiler

Rekenkundige uitzondering in C
Onderzoek ongeldige gehele delingen achter de melding floating point exception.

Ondanks de historische naam kan de melding ontstaan door gehele deling door nul, zonder drijvendekommagetallen. Het getoonde signaal en de afsluitcode hangen af van systeem en uitvoeringsdienst.

Controleer het inlezen en test de deler vóór / of %. Ook een deling met teken waarvan het quotiënt niet past, zoals de minimumwaarde gedeeld door -1 bij gebruikelijke typen, is problematisch.

Isoleer de operanden en controleer hun bereik. Onderscheid regels voor gehele getallen van die voor drijvendekommagetallen: zonder begrip het type veranderen kan een nieuwe fout geven.

Broncode

#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;
}
Openen in de compiler

Verwacht resultaat

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

Veelgestelde vragen

Waarom blijven code en sommige resultaten Engels?

C-sleutelwoorden, namen, programmacommentaar en verwachte uitvoer blijven gelijk aan het origineel om uitvoerbare code en consistente tests te behouden. Uitleg en instructies zijn vertaald.