Комментарии 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, имеет знаковый бит, равный нулю, что означает знак "плюс"? Наконец, Вы отрицаете, что нуль как вещественное число имеет знак? И как последнее согласуется с Вашим утверждением, что "Ноль он и в Африке ноль", когда это прямо противоречит математике?
И, кстати, если уж касаться "усложнения разработки процессоров", то неплохо было бы спуститься на уровень схемотехники и показать, чем так хорош дополнительный код (а он действительно хорош, иначе б его не использовали). Правда, сразу возникает вопрос: а почему в вещественных числах используют прямой код (и имеют положительный и отрицательный нули)? В общем, улучшать есть куда.
Дополнительный код/запись отрицательных чисел в памяти компьютера