Ошибка выполнения при делении на -1

Я не сомневаюсь в необходимости проверки деления на ноль. Я никогда не слышал о проверке деления на отрицательные!

if( *y == 0 )
return 0; //undefined
else
return *x / *y;

x, y являются указателями на int32_tЯ включаю эту деталь в случае актуальности.

Во время выполнения, если *x==0x80000000, *y==0xffffffffЯ получаю ошибку (в Xcode):

EXC_ARITHMETIC (код = EXC_I386_DIV, субкод = 0x0)

Все, что я могу найти в Интернете, — это предположения, что это деление на ноль, но, как вы можете видеть из проверки выше, и я могу видеть из окна отладки, здесь это не так.

Что означает ошибка и как ее исправить?

3

Решение

Представление дополнения 2 асимметрично: существует еще одно отрицательное число, чем положительное число, и это отрицательное число не имеет положительного аналога. Следовательно, отрицание MIN_INT целочисленное переполнение (где MIN_INT это значение, чей единственный 1-бит является знаковым битом, 0x80000000 для 32-битных целых чисел).

MIN_INT / -1 следовательно, также является арифметическим переполнением. В отличие от переполнения от вычитания (которое редко проверяется), переполнение при делении может вызвать ловушку, и, очевидно, именно это происходит в вашем случае.

И, да, технически говоря, вы должны проверить MIN_INT / -1 случай переполнения перед делением, потому что результат не определен.

Замечания: В обычном случае архитектуры Intel x64 переполнение деления перехватывает ловушку, точно так же, как деление на 0. Неожиданно соответствующий сигнал Posix SIGFPE который обычно рассматривается как «Исключение с плавающей запятой», хотя в поле зрения нет плавающей запятой. Текущий стандарт Posix на самом деле глянец SIGFPE в значении «ошибочная арифметическая операция».

12

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


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