Что произойдет, если я разделю на ноль?

Теперь я не спрашиваю о математическом ответе деления на ноль, я хочу узнать, что делает мой компьютер, когда он пытается разделить на ноль?

Я вижу разные ответы в зависимости от того, на каком уровне мы смотрим? Глядя на высокий уровень, я ожидаю, что спецификация языка может просто сказать: «Эй, вы не можете сделать это с ошибкой».

Глядя на уровень ассемблера, попытается ли ЦП вызвать команду деления, когда мы попытаемся разделить на 0?

Если это произойдет, мы перейдем на уровень машинного кода. Что происходит сейчас?

Теперь, если этого не произойдет, и мы заставим это произойти, каков будет результат?


person Lerp    schedule 30.12.2013    source источник
comment
зависит от архитектуры — см. здесь   -  person user3125280    schedule 30.12.2013
comment
можно предположить, что хищники схватили его? - и OP intel выдает исключение "Divide Error" - хотя исключения на уровне машины отличаются от попыток перехвата исключений   -  person user3125280    schedule 30.12.2013
comment
Серьезно сейчас. Если бы у вас был компьютер, вы могли бы проверить, что происходит. И, согласно вашему определению, C не является языком высокого уровня...   -  person Mr Lister    schedule 30.12.2013
comment
Этот вопрос кажется не по теме, потому что это не проблема программирования, а скорее вопрос об архитектуре ЦП. Попробуйте cs.stackexchange.com   -  person Raymond Chen    schedule 30.12.2013


Ответы (2)


Глядя на уровень ассемблера, попытается ли ЦП вызвать команду деления, когда мы попытаемся разделить на 0?

Да, инструкция извлекается и декодируется. Что происходит тогда? Делитель оказывается равным нулю, и процесс прекращает делать то, что он делает. Он выдает какое-то исключение, конвейер (если он есть) сбрасывается и, скорее всего, управление переходит к какому-то заранее определенному коду обработки ошибок — часто ОС управляет таблицей переходов на машинном уровне, называемой вектором прерывания (или это может быть отдельный для таблицу векторов прерываний).

Однако существует много архитектур, и такие вещи, как обработка ошибок, различаются. Intel x86, по крайней мере, следует описанной выше процедуре.

Если это произойдет, мы перейдем на уровень машинного кода. Что происходит сейчас?

Я понятия не имею, что это значит. С точки зрения ЦП, это все уровень машинного кода.

person user3125280    schedule 30.12.2013

Я думаю, что вы спрашиваете, что произойдет, если мы выполним алгоритм двоичного деления с 0 в знаменателе.

Алгоритм войдет в бесконечный цикл, и частное будет расти все больше и больше, пока не исчерпает всю доступную память.

person Alexey Lebedev    schedule 30.12.2013
comment
Если это серьезно, то это серьезно сломано. Если это с юмором, ну, это не очень смешно, как написано. - person High Performance Mark; 30.12.2013
comment
Это серьезно. Не могли бы вы просветить меня? - person Alexey Lebedev; 30.12.2013
comment
Прочтите другой ответ. К этому я бы добавил, что алгоритмы деления обычно проверяют делитель в начале и выдают какую-то ошибку, если он оказывается равным 0. - person High Performance Mark; 30.12.2013
comment
Ну, я думаю, вы не поняли мой ответ. Процессор явно не будет пытаться делить на 0, он выдаст исключение или установит флаг. Но все же интересно подумать, что произойдет, если мы попытаемся выполнить алгоритм, такой как деление в длину или деление путем многократного вычитания. О чем мой ответ. - person Alexey Lebedev; 30.12.2013
comment
Вы совершенно правы, я не понимаю вашего ответа. Любой алгоритм, который предлагает реализовать деление повторным вычитанием, которое не проверяет, что делитель отличен от нуля, является сломанным алгоритмом именно по той причине, которую вы объясняете: если он не может выполнить эту проверку, он завершится только при переполнении счетчика. - person High Performance Mark; 31.12.2013
comment
@HighPerformanceMark Я думаю, что под алгоритмом выполнения ... с 0 в знаменателе здесь подразумевается игнорирование любых предварительных условий и выполнение алгоритма в любом случае. Таким образом, хотя полный алгоритм будет проверять знаменатель 0 и выдавать ошибку, вопрос ОП, похоже, спрашивает, что произойдет, если эта проверка не будет выполнена. (Это то, к чему относится этот ответ) - person SamYonnou; 31.12.2013
comment
@SamYonnou: да, и я думаю, что именно это имел в виду OP, спрашивая Теперь, если этого [деления на 0] не произойдет, и мы заставим это произойти, каков будет результат? - person Alexey Lebedev; 31.12.2013