Online C Compiler
Abrir no compilador

Edição didática em português. O código e suas saídas preservam o original.

Exceção aritmética SIGFPE em C

Revise divisões inteiras, restos e faixas mesmo quando o nome do erro menciona ponto flutuante.

Abrir no compilador

Exceção aritmética SIGFPE em C
Revise divisões inteiras, restos e faixas mesmo quando o nome do erro menciona ponto flutuante.

SIGFPE pode aparecer por uma operação aritmética inválida, incluindo divisão inteira por zero. O nome histórico não significa que o programa use necessariamente float ou double. O código de saída mostrado por um ambiente é uma convenção desse ambiente.

Verifique o divisor antes de usar / ou %. Confira também se a entrada foi lida corretamente: um valor não inicializado ou inesperado pode chegar ao cálculo. Em inteiros com sinal, um quociente que não cabe no tipo também é problemático.

Reduza o caso aos operandos que causam a falha e valide a faixa antes de calcular. Não confunda o comportamento da divisão inteira com as regras de ponto flutuante, que dependem do ambiente e de suas opções.

Código C

#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;
}
Abrir no compilador

Saída esperada

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

Perguntas frequentes

Por que o código e a saída continuam em inglês?

Palavras-chave, identificadores e textos verificados pelos testes são preservados para não alterar o programa. As explicações e os controles estão traduzidos.