Изменения

Перейти к: навигация, поиск
м
Нет описания правки
=== Достоинства представления чисел с помощью прямого кода ===
#Получить прямой код числа достаточно просто;.#изИз-за того, что <tex>0</tex> обозначает <tex>+</tex>, коды положительных чисел относительно беззнакового кодирования остаются неизменными.#Количество положительных чисел равно количеству отрицательных.
=== Недостатки представления чисел с помощью прямого кода ===
#Выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора (например, для вычитания невозможно использовать сумматор, необходима отдельная схема для этого);.#существуют Существуют два нуля: <tex> +0 </tex> <tex>(100 \ldots 000) </tex> и <tex> -0 </tex> <tex> (000 \ldots 000) </tex>, из-за чего усложняется арифметическое сравнение.
Из-за весьма существенных недостатков прямой код используется очень редко.
=== Достоинства представления чисел с помощью кода со сдвигом ===
#Не требуется усложнение архитектуры процессора;.#нет Нет проблемы двух нулей.
=== Недостатки представления чисел с помощью кода со сдвигом ===
#При арифметических операциях нужно учитывать смещение, то есть проделывать на одно действие больше (например, после «обычного» сложения двух чисел у результата будет двойное смещение, одно из которых необходимо вычесть);.#ряд Ряд положительных и отрицательных чисел несимметричен.
Из-за необходимости усложнять арифметические операции код со сдвигом для представления целых чисел используется не часто, но зато применяется для хранения порядка [[Представление вещественных чисел|вещественного числа]].
#Простое получение кода отрицательных чисел.
#изИз-за того, что <tex>0</tex> обозначает <tex>+</tex>, коды положительных чисел относительно беззнакового кодирования остаются неизменными.#Количество положительных чисел равно количеству отрицательных.
=== Недостатки представления чисел с помощью кода с дополнением до единицы ===
#Выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора;.#существуют Существуют два нуля: <tex> +0 </tex> и <tex> -0 </tex>.
== Дополнительный код (дополнение до двух) ==
Можно получить диапазон значений <tex> [-2^{n-1}; 2^{n-1} - 1] </tex>.
 
=== Длинная арифметика для чисел, представленных с помощью кода с дополнением до двух ===
Дополнительный код также удобно использовать для вычислений в длинной арифметике, особенно для операций сложения и вычитания. Это операции удобно выполнять с числами одинаковой длины, поэтому в старшие разряды меньшего числа нужно поместить нули (если число положительно) или единицы (если число отрицательно). Тогда числа будут выглядеть следующим образом: в старших разрядах бесконечное число нулей (единиц), а в младших разрядах уже встречаются и нули, и единицы, которые кодируют само число, а не знак. Удобство заключается в том, что нам не обязательно проделывать операции сложения с каждой парой бит, если мы знаем, что на этом отрезке в числах стоят либо единицы, либо нули. Таким образом, на этом отрезке в получившемся числе тоже будут либо только единицы, либо только нули. Операцию сложения можно выполнить только один раз для старших бит, таким образом мы узнаем знак получившегося числа. Вычитание тоже выполняется просто: инвертируем число, прибавляем один и получаем это число с минусом, затем просто делаем сложение.
Однако умножение с числами, представленными дополнительным кодом, выполнять не всегда оптимально: алгоритм либо слишком медленный (наивный алгоритм работает за <tex>O(n^2)</tex>), либо слишком сложный. Лучше для умножение использовать прямой код (бит под знак). Тогда можно числа перевести в десятичную систему счисления, выполнить быстрое преобразование Фурье за <tex>O(nlognn \log n)</tex>, затем перевести их обратно в двоичную. Обычно такой алгоритм работает быстрее, чем выполнение операции напрямую с двоичными числами. Для деления обычно тоже лучше использовать прямой код.
=== Достоинства представления чисел с помощью кода с дополнением до двух ===
#Возможность заменить арифметическую операцию вычитания операцией сложения и сделать операции сложения одинаковыми для знаковых и беззнаковых типов данных, что существенно упрощает архитектуру процессора и увеличивает его быстродействие;.#нет Нет проблемы двух нулей.
=== Недостатки представления чисел с помощью кода с дополнением до двух ===
#Ряд положительных и отрицательных чисел несимметричен, но это не так важно: с помощью дополнительного кода выполнены гораздо более важные вещи, желаемые от способа представления целых чисел;.#в В отличие от сложения, числа в дополнительном коде нельзя сравнивать как беззнаковые, или вычитать без расширения разрядности.
Несмотря на недостатки, дополнение до двух в современных вычислительных системах используется чаще всего.
65
правок

Навигация