Почему% 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;
}
Ответы
Ответ 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 не обязательно включает арифметику с плавающей запятой, нет никакого способа изменить ее имя, не нарушая обратной совместимости.