Изменения

Перейти к: навигация, поиск
Недостатки представления чисел с помощью прямого кода
Выбор способа хранения целых чисел в памяти компьютера — не такая тривиальная задача, как могло бы показаться на первый взгляд. Желательно, чтобы этот способ:
*не требовал усложнения архитектуры процессора для выполнения арифметических операций с отрицательными числами;,*не усложнял арифметические действия;,
*хранил бы одинаковое количество положительных и отрицательных чисел.
=== Достоинства представления чисел с помощью прямого кода ===
*получить #Получить прямой код числа достаточно просто.#Из-за того, что <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>(000 \ldots 000) </tex> или <tex> -0 </tex> <tex> (111 \ldots 111) </tex>.
Пример: переведём число <tex> -13 </tex> в двоичный восьмибитный код. Прямой код модуля <tex> -13 </tex>: <tex> 00001101 </tex>, инвертируем и получаем <tex> 11110010 </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(n \log n)</tex>, затем перевести их обратно в двоичную. Обычно такой алгоритм работает быстрее, чем длиннейшее из слагаемыхвыполнение операции напрямую с двоичными числами. Для деления обычно тоже лучше использовать прямой код
=== Достоинства представления чисел с помощью кода с дополнением до двух ===
*возможность #Возможность заменить арифметическую операцию вычитания операцией сложения и сделать операции сложения одинаковыми для знаковых и беззнаковых типов данных, что существенно упрощает архитектуру процессора и увеличивает его быстродействие;.*нет #Нет проблемы двух нулей.
=== Недостатки представления чисел с помощью кода с дополнением до двух ===
*ряд #Ряд положительных и отрицательных чисел несимметричен, но это не так важно: с помощью дополнительного кода выполнены гораздо более важные вещи, желаемые от способа представления целых чисел;.отличие от сложения, числа в дополнительном коде нельзя сравнивать как беззнаковые, или вычитать без расширения разрядности.
Несмотря на недостатки, дополнение до двух в современных вычислительных системах используется чаще всего.
Анонимный участник

Навигация