Online C Compiler
Buka di kompiler

Edisi pembelajaran bahasa Indonesia. Kode dan keluarannya tetap seperti aslinya.

Pengecualian aritmetika SIGFPE dalam C

Periksa pembagian bilangan bulat, sisa bagi, dan rentang meskipun nama kesalahan menyebut floating point.

Buka di kompiler

Pengecualian aritmetika SIGFPE dalam C
Periksa pembagian bilangan bulat, sisa bagi, dan rentang meskipun nama kesalahan menyebut floating point.

SIGFPE dapat disebabkan oleh operasi aritmetika tidak sah, termasuk pembagian bilangan bulat dengan nol. Nama historisnya tidak berarti program harus menggunakan float atau double. Kode keluar yang ditampilkan bergantung pada konvensi lingkungan.

Periksa pembagi sebelum / dan %. Pastikan pembacaan masukan berhasil karena nilai yang belum diinisialisasi atau tidak diharapkan dapat masuk ke perhitungan. Pada integer bertanda, hasil pembagian yang tidak muat dalam tipe juga bermasalah.

Temukan operand yang menyebabkan kegagalan dan validasi rentangnya sebelum menghitung. Jangan menyamakan aturan pembagian bilangan bulat dengan floating point karena perilakunya bergantung pada lingkungan dan opsi.

Kode 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;
}
Buka di kompiler

Keluaran yang diharapkan

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

Pertanyaan umum

Mengapa kode dan keluarannya tetap dalam bahasa Inggris?

Kata kunci, pengenal, dan teks yang diperiksa tes dipertahankan agar program tidak berubah. Penjelasan dan kontrol telah diterjemahkan.