Изменения

Перейти к: навигация, поиск
м
Нет описания правки
Выбор способа хранения целых чисел в памяти компьютера — не такая тривиальная задача, как могло бы показаться на первый взгляд. Желательно, чтобы этот способ:
*не требовал усложнения архитектуры процессора для выполнения арифметических операций с отрицательными числами;,*не усложнял арифметические действия;,
*хранил бы одинаковое количество положительных и отрицательных чисел.
=== Достоинства представления чисел с помощью прямого кода ===
*получить #Получить прямой код числа достаточно просто;#из-за того, что <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(nlogn)</tex>, затем перевести их обратно в двоичную. Обычно такой алгоритм работает быстрее, чем длиннейшее из слагаемыхвыполнение операции напрямую с двоичными числами. Для деления обычно тоже лучше использовать прямой код
=== Достоинства представления чисел с помощью кода с дополнением до двух ===
*возможность #Возможность заменить арифметическую операцию вычитания операцией сложения и сделать операции сложения одинаковыми для знаковых и беззнаковых типов данных, что существенно упрощает архитектуру процессора и увеличивает его быстродействие;*#нет проблемы двух нулей.
=== Недостатки представления чисел с помощью кода с дополнением до двух ===
*ряд #Ряд положительных и отрицательных чисел несимметричен, но это не так важно: с помощью дополнительного кода выполнены гораздо более важные вещи, желаемые от способа представления целых чисел;*#в отличие от сложения, числа в дополнительном коде нельзя сравнивать как беззнаковые, или вычитать без расширения разрядности.
Несмотря на недостатки, дополнение до двух в современных вычислительных системах используется чаще всего.
65
правок

Навигация