Изменения
→Недостатки представления чисел с помощью прямого кода
Выбор способа хранения целых чисел в памяти компьютера — не такая тривиальная задача, как могло бы показаться на первый взгляд. Желательно, чтобы этот способ:
*не требовал усложнения архитектуры процессора для выполнения арифметических операций с отрицательными числами;,*не усложнял арифметические действия;,
*хранил бы одинаковое количество положительных и отрицательных чисел.
=== Достоинства представления чисел с помощью прямого кода ===
=== Недостатки представления чисел с помощью прямого кода ===
Из-за весьма существенных недостатков прямой код используется очень редко.
=== Достоинства представления чисел с помощью кода со сдвигом ===
=== Недостатки представления чисел с помощью кода со сдвигом ===
Из-за необходимости усложнять арифметические операции код со сдвигом для представления целых чисел используется не часто, но зато применяется для хранения порядка [[Представление вещественных чисел|вещественного числа]].
*если число положительное, то в старший разряд (который является знаковым) записывается ноль, а далее записывается само число;
*если число отрицательное, то код получается инвертированием представления модуля числа (получается обратный код);
*если число является нулем, от то его можно представить двумя способами: <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> [-2^{n-1}; 2^{n-1} - 1] </tex>.
=== Длинная арифметика для чисел, представленных с помощью кода с дополнением до двух === Дополнительный код также удобно использовать для вычислений в длинной арифметике, особенно для операций сложения и вычитания. Для сложения чисел Это операции удобно выполнять с разными знаками числами одинаковой длины, поэтому в старшие разряды меньшего числа нужно сложить все битыпоместить нули (если число положительно) или единицы (если число отрицательно). Тогда числа будут выглядеть следующим образом: в старших разрядах бесконечное число нулей (единиц), запоминая перенос. При сложении последних двух битов перенос нужно проигнорироватьа в младших разрядах уже встречаются и нули, и единицы, чтобы которые кодируют само число по длине получилось равным длиннейшему из слагаемых, а не знак определится автоматически. При сложении чисел Удобство заключается в том, что нам не обязательно проделывать операции сложения с одинаковыми знаками нужно следовать такому же алгоритмукаждой парой бит, если мы знаем, что на этом отрезке в числах стоят либо единицы, нолибо нули. Таким образом, если последние два бита переноса на этом отрезке в получившемся числе тоже будут разнымилибо только единицы, возникнет переполнениелибо только нули. В таком случае последний бит переноса откидывать Операцию сложения можно выполнить только один раз для старших битов, таким образом мы узнаем знак получившегося числа. Вычитание тоже выполняется просто: инвертируем число, прибавляем один и получаем это число с минусом, затем просто делаем сложение.Однако умножение с числами, представленными дополнительным кодом, выполнять не надовсегда оптимально: алгоритм либо слишком медленный (наивный алгоритм работает за <tex>O(n^2)</tex>), и результат окажется на либо слишком сложный. Лучше для умножение использовать прямой код (бит длиннеепод знак). Тогда можно числа перевести в десятичную систему счисления, выполнить быстрое преобразование Фурье за <tex>O(n \log n)</tex>, затем перевести их обратно в двоичную. Обычно такой алгоритм работает быстрее, чем длиннейшее из слагаемыхвыполнение операции напрямую с двоичными числами. Для деления обычно тоже лучше использовать прямой код.
=== Достоинства представления чисел с помощью кода с дополнением до двух ===
=== Недостатки представления чисел с помощью кода с дополнением до двух ===
Несмотря на недостатки, дополнение до двух в современных вычислительных системах используется чаще всего.