65
правок
Изменения
Выполнен тикет 4.2 (пункт 7 выполнен частично)
== Прямой код ==
[[Файл:Представление двоичных чисел в прямом коде.jpg|230px|thumb|right|Нумерация двоичных чисел в прямом представлении]]
При записи числа в '''прямом коде''' (англ. ''sign-and-Signed magnitude methodrepresentation'') старший разряд является знаковым разрядом. Если его значение равно нулю, то представлено положительное число положительноеили положительный ноль, если единице — , то представлено отрицательноечисло или отрицательный ноль. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа. Например, число <tex> -5 </tex> в восьмибитном типе данных, использующем прямой код, будет выглядеть так: <tex> 10000101 </tex>.
Таким способом в <tex> n </tex>-битовом типе данных можно представить диапазон чисел <tex> [-2^{n-1} + 1; 2^{n-1} - 1] </tex>.
*получить прямой код числа достаточно просто.
*выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора (например, для вычитания невозможно использовать сумматор, необходима отдельная схема для этого);
*существуют два нуля : <tex> +0 </tex> <tex>(100 \ldots 000) </tex> и <tex> -0 </tex> <tex> (000 \ldots 000) </tex>, из-за чего усложняется арифметическое сравнение.
Из-за этого весьма существенных недостатков прямой код используется очень редко.
== Код со сдвигом ==
[[Файл:Представление двоичных чисел в коде со сдвигом.jpg|230px|thumb|right|Код со сдвигом. Как видно, двоичное представление зациклено по модулю <tex dpi="100">1000..000_{(2)}</tex> (<tex>n</tex> нулей)]]При использовании '''кода со сдвигом''' (англ. ''excess-''<tex> K </tex>, где <tex> K = 2^{n-1} </tex>; также говорят ''biased representationOffset binary'') целочисленный отрезок от нуля до <tex> 2^n </tex> (<tex> n </tex> — количество бит) сдвигается влево на <tex> 2^{n-1} </tex>, а затем получившиеся на этом отрезке числа последовательно кодируются в порядке возрастания кодами от <tex> 000 \dots 0 </tex> до <tex> 111 \dots 1 </tex>. Например, число <tex> -5 </tex> в восьмибитном типе данных, использующем код со сдвигом, превратится в <tex> -5 + 128 = 123 </tex>, то есть будет выглядеть так: <tex> 01111011 </tex>.
По сути, при таком кодировании:
Можно получить диапазон значений <tex> [-2^{n-1}; 2^{n-1} - 1]</tex>.
*не требуется усложнение архитектуры процессора;
*нет проблемы двух нулей.
*при арифметических операциях нужно учитывать смещение, то есть проделывать на одно действие больше (например, после «обычного» сложения двух чисел у результата будет двойное смещение, одно из которых необходимо вычесть);
*ряд положительных и отрицательных чисел несимметричен.
Из-за необходимости усложнять арифметические операции код со сдвигом для представления целых чисел используется не часто, но зато применяется для хранения порядка [[Представление вещественных чисел|вещественного числа]].
== Дополнительный код (дополнение до единицы) ==
[[Файл:Представление_чисел_дополнением_до_единицы.jpg|230px|thumb|right|Нумерация двоичных чисел в представлении c дополнением до единицы. В отличии от кода со сдвигом, нулю соответствуют коды <tex> 00...000 </tex> и <tex> 11...111 </tex>]]
В качестве альтернативы представления целых чисел может использоваться код с '''дополнением до единицы ''' (англ. ''Ones' complement'').
Алгоритм получения кода числа:
*если число положительное, то в старший разряд (который является знаковым) записывается ноль, а далее записывается само число;
*если число отрицательное, то код получается инвертированием представления модуля числа (получается '''обратный код''');*если число является нулем, от его можно представить двумя способами: <tex> +0 </tex> <tex>(000 \ldots 000) </tex> или <tex> -0 </tex> <tex> (111 \ldots 111) </tex>.
Пример: переведём число <tex> -13 </tex> в двоичный восьмибитный код (так оно будет храниться в типе данных ''unsigned char''). Прямой код модуля <tex> -13 </tex> — : <tex> 00001101 </tex>, инвертируем и получаем <tex> 11110010 </tex>.
Для получения из дополнительного кода самого числа достаточно инвертировать все разряды кода.
Таким способом можно получить диапазон значений <tex> [-2^{n-1}+1; 2^{n-1} - 1] </tex>.
*Простое получение кода отрицательных чисел.
*выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора;
*существуют два нуля : <tex> +0 </tex> и <tex> -0 </tex>.
== Дополнительный код (дополнение до двух) ==
[[Файл:Представление двоичных чисел в дополнительном коде.jpg|230px|thumb|right|Нумерация двоичных чисел в представлении c дополнением до двух.]]
Чаще всего для представления отрицательных чисел используется код с '''дополнением до двух ''' (англ. ''Two's complement'').
Алгоритм получения дополнительного кода числа:
*если число отрицательное, то все биты модуля числа инвертируются, то есть все единицы меняются на нули, а нули — на единицы, к инвертированному числу прибавляется единица, далее к результату дописывается знаковый разряд, равный единице.
В качестве примера переведём число <tex> -5 </tex> в дополнительный восьмибитный код. Прямой код модуля <tex> -5 </tex> — : <tex> 0000101 </tex>, обратный — <tex> 1111010 </tex>, прибавляем <tex> 1 </tex>, получаем <tex> 1111011 </tex>, приписываем <tex> 1 </tex> в качестве знакового разряда, в результате получаем <tex> 11111011 </tex>.
Также дополнительный код отрицательного числа <tex> A </tex>, хранящегося в <tex> n </tex> битах, равен <tex> 2^n - |A| </tex>. По сути, дополнительный код представляет собой дополнение <tex> |A| </tex> до <tex> 0 </tex>: так как в <tex> n </tex>-разрядной арифметике <tex> 2^{n} = 0 </tex> (двоичная запись этого числа состоит из единицы и <tex> n </tex> нулей, а в <tex> n </tex>-разрядную ячейку помещаются только <tex> n </tex> младших разрядов, то есть <tex> n </tex> нулей), то верно равенство <tex> 2^n - |A| + |A| = 0 </tex>.
Можно получить диапазон значений <tex> [-2^{n-1}; 2^{n-1} - 1] </tex>.
*возможность заменить арифметическую операцию вычитания операцией сложения и сделать операции сложения одинаковыми для знаковых и беззнаковых типов данных, что существенно упрощает архитектуру процессора и увеличивает его быстродействие;
*нет проблемы двух нулей.
*ряд положительных и отрицательных чисел несимметричен, но это не так важно: с помощью дополнительного кода выполнены гораздо более важные вещи, желаемые от способа представления целых чисел.;
*в отличие от сложения, числа в дополнительном коде нельзя сравнивать как беззнаковые, или вычитать без расширения разрядности.
Несмотря на недостатки, дополнение до двух в современных вычислительных системах используется чаще всего. == Литература См. также == *[[Представление_вещественных_чисел | Представление вещественных чисел]]*[[Представление_символов,_таблицы_кодировок | Представление символов, таблицы кодировок]] == Источники информации ==
*Эндрю Таненбаум «Архитектура компьютера», 5-е изд., стр. 739—741
*[https://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement Wikipedia — Signed number representations]
*[https://en.wikipedia.org/wiki/Offset_binary Wikipedia — Offset binary]
*[http://ru.wikipedia.org/wiki/Прямой_код Википедия — Прямой код]
*[http://ru.wikipedia.org/wiki/Дополнительный_код_(представление_числа) Википедия — Дополнительный код]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Представление информации]]