Изменения

Перейти к: навигация, поиск
Нет описания правки
== Прямой код ==
При записи числа в '''прямом коде''' (''sign-and-magnitude method'') старший разряд (''most significant bit'') является знаковым разрядом (''sign bit''). Если его значение равно нулю, то число положительное, если единице — отрицательное. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа. Например, число -5 в восьмибитном типе данных , использующем прямой код, будет выглядеть так: 10000101.
Таким способом в <tex> n </tex>-битовом типе данных можно представить диапазон чисел <tex> [-2^{n-1} + 1; 2^{n-1} - 1] </tex>.
== Код со сдвигом ==
При использовании '''кода со сдвигом''' (''excess-''<tex> K </tex>, где <tex> K = 2^{n-1} </tex>; также говорят ''biased representation'') мы сдвигаем целочисленный отрезок от нуля до <tex> 2^n </tex> (<tex> n </tex> — количество бит) влево на <tex> 2^{n-1} </tex>, а затем последовательно кодируем получившееся на этом отрезке числа в порядке возрастания кодами от 000...0 до 111...1. Например, число -5 в восьмибитном типе данных , использующем код со сдвигом, превратится в -5 + 128 = 123, то есть будет выглядеть так: 01111011.
По сути, при таком кодировании:
*если число отрицательное, то все биты модуля числа инвертируются, то есть все единицы меняются на нули, а нули — на единицы (получается '''обратный код'''), к инвертированному числу прибавляется единица, далее к результату дописывается знаковый разряд, равный единице.
В качестве примера переведём число -5 в дополнительный восьмибитный код(так оно будет храниться в типе данных unsigned char). Прямой код модуля -5 — 0000101, обратный — 1111010, прибавляем 1, получаем 1111011, приписываем 1 в качестве знакового разряда, в результате получаем 11111011.
Также дополнительный код отрицательного числа <tex> А </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 </tex>. Переведём 11111011 обратно. Инвертируем — 00000100, прибавляем 1, получаем 00000101 — модуль исходного числа -5. Проверим: 11111011 + 00000101 = 100000000.
Можно получить диапазон значений <tex> [-2^{n-1}; 2^{n-1} - 1]</tex>.
Достоинства метода:
*ряд положительных и отрицательных чисел несимметричен.
 
==Беззнаковые типы данных==
В современных компьютерах беззнаковые типы данных хранятся в прямом коде, а знаковые — в дополнительном. Это позволяет одинаково реализовывать арифметические операции для них. Однако из-за того, что в беззнаковом <tex> n </tex>-битном типе данных можно представить диапазон <tex> [0; 2^n - 1] </tex>, а в <tex> n </tex>-битном знаковом — <tex> [-2^{n-1}; 2^{n-1} - 1] </tex>, то может произойти переполнение.
==Список литературы==
*Эндрю Таненбаум «Архитектура компьютера», 5-е изд., стр. 739—741
 
*[http://en.wikipedia.org/wiki/Signedness Wikipedia: Signedness]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Представление информации]]
418
правок

Навигация