Я не сомневаюсь в необходимости проверки деления на ноль. Я никогда не слышал о проверке деления на отрицательные!
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)
Все, что я могу найти в Интернете, — это предположения, что это деление на ноль, но, как вы можете видеть из проверки выше, и я могу видеть из окна отладки, здесь это не так.
Что означает ошибка и как ее исправить?
Представление дополнения 2 асимметрично: существует еще одно отрицательное число, чем положительное число, и это отрицательное число не имеет положительного аналога. Следовательно, отрицание MIN_INT
целочисленное переполнение (где MIN_INT
это значение, чей единственный 1-бит является знаковым битом, 0x80000000 для 32-битных целых чисел).
MIN_INT / -1
следовательно, также является арифметическим переполнением. В отличие от переполнения от вычитания (которое редко проверяется), переполнение при делении может вызвать ловушку, и, очевидно, именно это происходит в вашем случае.
И, да, технически говоря, вы должны проверить MIN_INT / -1
случай переполнения перед делением, потому что результат не определен.
Замечания: В обычном случае архитектуры Intel x64 переполнение деления перехватывает ловушку, точно так же, как деление на 0. Неожиданно соответствующий сигнал Posix SIGFPE
который обычно рассматривается как «Исключение с плавающей запятой», хотя в поле зрения нет плавающей запятой. Текущий стандарт Posix на самом деле глянец SIGFPE
в значении «ошибочная арифметическая операция».