Online C Compiler
Abrir en el compilador

Edición didáctica en español. El código y sus salidas conservan el original.

Excepción aritmética SIGFPE en C

Revisa divisiones enteras, restos y rangos aunque el nombre del error mencione punto flotante.

Abrir en el compilador

Excepción aritmética SIGFPE en C
Revisa divisiones enteras, restos y rangos aunque el nombre del error mencione punto flotante.

SIGFPE puede aparecer por una operación aritmética inválida, incluida la división entera por cero. El nombre histórico no significa que el programa use necesariamente float o double. El código de salida que muestra un entorno es una convención de ese entorno.

Comprueba el divisor antes de usar / o %. Revisa también si la entrada se leyó correctamente: un valor sin inicializar o inesperado puede llegar al cálculo. En enteros con signo, un cociente que no cabe en el tipo también es problemático.

Reduce el caso a los operandos que provocan el fallo y valida el rango antes de calcular. No confundas el comportamiento de división entera con las reglas de punto flotante, que dependen del entorno y de sus opciones.

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 en el compilador

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

Preguntas frecuentes

¿Por qué el código y la salida siguen en inglés?

Las palabras clave, los identificadores y los textos que verifican las pruebas se conservan para no cambiar el programa. Las explicaciones y los controles están traducidos.