Почему% b производит SIGFPE, когда b равно нулю? - программирование
Подтвердить что ты не робот

Почему% b производит SIGFPE, когда b равно нулю?

Сегодня я отслеживал исключение с плавающей точкой в ​​некотором коде, который только что написал. Потребовалось немного времени, чтобы найти, потому что это было вызвано тем, что принимал целочисленный mod zero. Очевидно, что делать что-либо mod zero не будет определено, но я подумал, что странно, что ошибка была настолько обманчивой. Что это такое в операторе С++ modulo, который использовал бы плавающие точки для двух целых чисел? (Я использую gcc 4.3.2)

Вот простая программа для демонстрации ошибки.

int main()
{
    int a=3,b=0;
    int c=a%b;
    return 0;
}
4b9b3361

Ответ 1

Операция вызывает SIGFPE:

SIG является общим префиксом для сигнала имена; FPE является акронимом для исключение с плавающей запятой. Несмотря на то что SIGFPE не обязательно включает арифметика с плавающей запятой, нет способ изменить свое имя без разрушая обратную совместимость.

GDB немного понятнее и называет это "Арифметическое исключение":

(gdb) run
Starting program: /home/emil/float

Program received signal SIGFPE, Arithmetic exception.
0x0804837d in main () at float.c:4
4           int c=a%b;

Ответ 2

Посмотрите эту страницу.

Соответствующая часть для вашего вопроса:

SIG является общим префиксом для имен сигналов; FPE является аббревиатурой для исключения с плавающей точкой. Хотя SIGFPE не обязательно включает арифметику с плавающей запятой, нет никакого способа изменить ее имя, не нарушая обратной совместимости.