Как стать автором
Обновить

Комментарии 19

Учебник Информатики 8 класс. Студенты уже кончились?

Нестор Иванович, в учебниках обычно просто формально приводится алгоритм преобразования без объяснения того, почему он выглядит именно так, а не иначе. Я же попытался исправить эту ситуацию, объяснив то, какие побуждения были предприняты теми, кто придумывал дополнительный код. Не каждому повезло взять в руки толковое пособие, или иметь хорошего преподавателя

Спасибо. Но на днях уже была такая статья.

Не увидел, почему код называется дополнительным :)

Кроме того, нуль считается положительным числом. Это в математике у него нет знака, а в компутерах очень даже есть.

А можно, пожалуйста, поподробнее: почему это в компуктерах у нуля есть знак?

Потому что с результатом операции (в том числе сравнения или проверки значения) связаны, как правило, четыре пары атрибутов: нуль/не нуль, плюс/минус, перенос/нет переноса, переполнение/нет переполнения. Скажем, если сравниваются два одинаковых числа, будут получены признаки "нуль" (он же равно: сравнение выполняется путём вычитания, только результат собственно вычитания теряется, остаются лишь признаки результата) и "плюс" (поскольку старший бит результата равен нулю). Если сразу после сравнения выполнить команду "переход, если результат положительный", переход произойдёт -- т.е. равенство (нулевой результат вычитания) будет воспринято как положительное число. Это хорошо видно, если писать на ассемблере (см., например, регистр флагов в архитектуре IA-32, она же x86, или регистр состояния процессора в архитектуре ARM).

Мало что понял из вашего "объяснения". Очень путано пытаетесь донести свою мысль

Будто бы ответ создан нейронкой Яндекса, прогнанной несколько раз через переводчик.

Если в некоторой архитектуре при условной переходе ноль воспринимается как положительные число, то это не значит, что в компьютерах ноль имеет знак. Частный пример ничего не говорит об общем.

Да и такой переход можно трактовать, как переход при неотрицательном результате.

Вообще, в большинстве архитектур так, включая IA-32 (x86) и ARM. Ну а вещественный нуль вообще везде знак имеет, похоже.

В архитектуре Risc-V такого перехода условного нет. Вы можете разве что сравнить значение в некотором регистре с нулем.

В MIPS, кажется, тоже. А в IBM System/360 система переходов другая, поэтому там целочисленного знакового нуля, с точки зрения программиста, тоже нет: там ещё не четыре традиционных флажка, а двухбитовый код условия, правила установки которого зависят от типа выполняющейся команды. Поэтому тамошняя система команд имеет отдельные команды сложения-вычитания для знаковых чисел и для беззнаковых: сам результат, понятно дело, идентичен, отличается лишь установка кода условия. Но появились эти машинки ещё в середине 1960-х, у основной массы более современных -- те самые четыре флажка, что оказалось наиболее удобным для программиста.

В общем, утверждать категорически, что нуль в вычислительной технике не имеет знака, нельзя -- особенно если пишешь на ассемблере, так как там зачастую надо сей факт учитывать (скажем, анализировать на нулевой результат до того, как проверять на плюс -- естественно, где система команд это предусматривает). Плюс, как уже говорил, у вещественных нуль имеет знак -- в определённых ситуациях тоже может добавить проблем, если это игнорировать (хотя там куда чаще имеют проблемы из-за ограниченной точности и правил округления: складывают, скажем, два числа, а результат остаётся таким же, как большее по абсолютной величине из этих чисел).

Вы аппелируте к флагу SF, который равен старшему значащему биту результата. Но то, что бит равен 0 лишь значит, что результат неотрицательный, а не положительный. Непонятно откуда вы взяли, что это признак плюса

UPD:
Даже рандомная картинка из интернета это подтверждает (см jns)

А, например, в PDP-11 и ARM этот бит называется N (понятное дело, от negative), а для обозначения условия перехода используется сочетание PL -- от plus, естественно:

Как видите, в этом отрывке (из описания архитектуры ARMv7-M) специально подчёркивается, что "плюс" -- это положительное число или нуль, а не только "настоящее" положительное число.

В общем, компьютерный мир намного шире, чем Ваше (и моё, да) представление о нём, и абстрактно-математическим концепциям он иногда не соответствует.

Ну это просто название) PL. Какая разница? Чисто ради сокращения могли написать. Просто челиксы решили придумать такое название для флага.

Окей, флаг N - это отрицательное число. Если N равен единице (true), то число отрицательное, если нулю (false), то неотрицательное. Неотрицательное не значит положительное

А переход -- по знаку "плюс" (BPL), и нуль рассматривается как имеющий знак "плюс". Неотрицательное не значит положительное только в математике -- напоминаю про существование положительного и отрицательного нуля в вещественных числах. Ну и в целых числах знаковый бит тоже есть, и он сброшен ("плюс") для нулевого значения числа.

Вы аппелируте исключительно к названию опкодов, транслируя при этом свои неверные суждения. Если опкод называется BPL это не значит, что если он срабатывает при нулевом результате то ноль считается положительным. Ну это же сюр) я могу создать свою архитектуру и назвать опкод BNE, который будет выполнять переход при отрицательном значении или нуле. И что, после этого ноль станет отрицательным? Ноль он и в Африке ноль.

Вы отрицаете, что старший бит целого числа, представленного в дополнительном коде, является битом знака? Вы отрицаете, что нулевое значение знакового бита соответствует знаку "плюс", а единичное -- знаку "минус"? Вы отрицаете, что число, имеющее значение 0, имеет знаковый бит, равный нулю, что означает знак "плюс"? Наконец, Вы отрицаете, что нуль как вещественное число имеет знак? И как последнее согласуется с Вашим утверждением, что "Ноль он и в Африке ноль", когда это прямо противоречит математике?

старший нулевой бит значит, что число либо положительное, либо ноль.

И, кстати, если уж касаться "усложнения разработки процессоров", то неплохо было бы спуститься на уровень схемотехники и показать, чем так хорош дополнительный код (а он действительно хорош, иначе б его не использовали). Правда, сразу возникает вопрос: а почему в вещественных числах используют прямой код (и имеют положительный и отрицательный нули)? В общем, улучшать есть куда.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории