Введение

Кодирование отрицательных чисел в двоичных системах счисления

В вычислительной технике требуются представления чисел со знаком для кодирования отрицательных чисел в двоичных системах счисления. В математике отрицательные числа в любой системе счисления представляются с помощью префикса знака минус ("−"). Однако в оперативной памяти или регистрах процессора числа представляются только как последовательности битов, без дополнительных символов. Четыре наиболее известных метода расширения двоичной системы счисления для представления чисел со знаком: знак-величина, дополнительный код единицы, дополнительный код двойки и сдвинутый двоичный код. Некоторые альтернативные методы используют неявные, а не явные знаки, например, отрицачная двоичная система, использующая основание −2. Соответствующие методы могут быть разработаны для других систем счисления, будь то положительные, отрицательные, дробные или другие вариации на эту тему. Не существует однозначного критерия, по которому какое-либо из представлений было бы универсально превосходящим. Для целых чисел представление, используемое в большинстве современных вычислительных устройств, – это дополнительный код двойки, хотя мейнфреймы серии Unisys ClearPath Dorado используют дополнительный код единицы.

История

Ранние дни цифровых вычислений характеризовались соперничеством идей в отношении как аппаратных технологий, так и математических технологий (систем счисления). Одним из главных вопросов был формат представления отрицательных чисел, по которому ведущие эксперты того времени высказывали очень сильные и различные мнения. Одна группа поддерживала систему дополнительного кода (дополнение до двух), которая доминирует и сегодня. Другая группа поддерживала систему дополнительного кода "один", где отрицательное значение формируется путем инвертирования всех битов его положительного эквивалента. Третья группа поддерживала представление "знак-величина", где значение меняется с положительного на отрицательное простым переключением старшего бита слова. Существовали аргументы за и против каждой из этих систем. Представление "знак-величина" облегчало трассировку дампов памяти (распространенный процесс в 1960-х годах), поскольку небольшие числовые значения использовали меньше единичных битов. Эти системы выполняли арифметику в дополнительном коде "один", поэтому числа должны были преобразовываться в значения дополнительного кода "один" при передаче из регистра в арифметическое устройство, а затем обратно в представление "знак-величина" при передаче результата обратно в регистр. Для реализации такой электроники требовалось больше логических элементов, чем для других систем – что было критичным фактором, учитывая стоимость и компоновку дискретных транзисторов. IBM была одним из первых сторонников представления "знак-величина", и их компьютеры серий 704, 709 и 709x, пожалуй, наиболее известны как системы, использующие его. Дополнительный код "один" позволял создавать несколько более простые аппаратные конструкции, поскольку не требовалось преобразования значений при передаче в арифметическое устройство и из него. Однако он также разделял нежелательную характеристику с представлением "знак-величина": возможность представления отрицательного нуля (−0). Отрицательный ноль ведет себя точно так же, как положительный ноль: при использовании в качестве операнда в любом вычислении результат будет одинаковым, независимо от того, является ли операнд положительным или отрицательным нулем. Недостатком является то, что наличие двух форм одного и того же значения требует двух сравнений при проверке на равенство с нулем. Вычитание в дополнительном коде "один" также может привести к заимствованию с переносом (описано ниже). Можно утверждать, что это усложняет логику сложения и вычитания, или, наоборот, упрощает ее, поскольку вычитание требует лишь инвертирования битов второго операнда при передаче его в сумматор. Компьютеры PDP 1, серии CDC 160, серии CDC 3000, серии CDC 6000, серии UNIVAC 1100 и LINC использовали представление в дополнительном коде "один". Дополнительный код (дополнение до двух) является самым простым в реализации на аппаратном уровне, что, возможно, и является главной причиной его широкой популярности. Процессоры ранних мейнфреймов часто состояли из тысяч транзисторов, поэтому устранение значительного их числа давало существенную экономию средств. Мейнфреймы, такие как IBM System/360, серия GE 600, PDP 6 и PDP 10, использовали дополнительный код, как и миникомпьютеры, такие как PDP 5 и PDP 8, PDP 11 и машины VAX. Архитекторы первых процессоров на основе интегральных схем (Intel 8080 и т. д.) также выбрали арифметику в дополнительном коде. С развитием технологии интегральных схем дополнительный код был принят практически во всех процессорах, включая x86, m68k, Power ISA, MIPS, SPARC, ARM, Itanium, PA RISC и DEC Alpha.

Другие системы

Протокол Google Buffers "зигзагообразное кодирование" – это система, аналогичная кодированию со знаком и величиной (sign-magnitude), но использующая младший значащий бит для представления знака и имеющая единственное представление нуля. Это позволяет эффективно использовать кодирование чисел переменной длины, предназначенное для неотрицательных (беззнаковых) целых чисел, для представления знаковых целых чисел. Аналогичный метод применяется в стандартах сжатия видео Advanced Video Coding/H.264 и High Efficiency Video Coding/H.265 для расширения экспоненциального кодирования Голомба на отрицательные числа. В этом расширении младший значащий бит почти является битом знака; ноль имеет такой же младший значащий бит (0), как и все отрицательные числа. Этот выбор приводит к тому, что наибольшее по модулю положительное число, которое можно представить, на единицу больше, чем наибольшее по модулю отрицательное число, в отличие от дополнительного кода или зигзагообразного кодирования протокола буферов. Другой подход заключается в присвоении знака каждой цифре, что приводит к представлению чисел со знаком. Например, в 1726 году Джон Колсон выступал за приведение выражений к "малым числам" – цифрам 1, 2, 3, 4 и 5. В 1840 году Огюстен Коши также выразил предпочтение таким модифицированным десятичным числам для уменьшения ошибок при вычислениях.