Арифметическое исключение в GDB, но я не делю на ноль?

Я получаю Floating point exception (core dumped) ошибка в моей C ++ программе, и GDB показывает, что проблема в строке, которая выполняет деление по модулю:

Program received signal SIGFPE, Arithmetic exception.
[Switching to Thread 0x7ffff6804700 (LWP 13931)]
0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
at exp.cpp:55
55              return (r==0) ? 0 : l % r;

Линия защищает от деления на ноль, и моя обратная трассировка показывает следующее:

#0  0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
at exp.cpp:55
l = -2147483648
r = -1

Поскольку я знаю, что делю не на ноль, что еще может быть причиной исключения?

5

Решение

Итак, я выяснил, в чем причина проблемы — арифметическое исключение может быть вызвано либо делением на ноль, либо переполнением подписанный целое число, которое здесь произошло. Целые числа без знака требуются для переноса при переполнении; поведение для целых чисел со знаком не определено.

6

Другие решения

Измените код на следующий, чтобы не пытаться взять по модулю отрицательное число, которое не определено:

return (r<=0) ? 0 : l % r;
3

Чтобы вычислить такое выражение по модулю: -2147483648 % -1требуется разделение, которое в данном случае выглядит как 32-разрядное (я думаю, l а также r определяются как int). Правильный результат такого разделения будет 2147483648, но это значение не может быть представлено в 32-битном формате, поэтому создается арифметическое исключение.

2
По вопросам рекламы [email protected]