Представление целых чисел: прямой код, код со сдвигом, дополнительный код — различия между версиями
Строка 1: | Строка 1: | ||
== Прямой код == | == Прямой код == | ||
− | При записи числа в '''прямом коде''' (''sign-and-magnitude method'') старший разряд (''most significant bit'') является знаковым разрядом (''sign bit''). Если его значение равно | + | При записи числа в '''прямом коде''' (''sign-and-magnitude method'') старший разряд (''most significant bit'') является знаковым разрядом (''sign bit''). Если его значение равно нулю, то число положительное, если единице — отрицательное. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа. |
Таким способом в <tex> n </tex>-битовом типе данных можно представить диапазон чисел <tex> [-2^{n-1} + 1; 2^{n-1} - 1] </tex>. | Таким способом в <tex> n </tex>-битовом типе данных можно представить диапазон чисел <tex> [-2^{n-1} + 1; 2^{n-1} - 1] </tex>. | ||
Строка 15: | Строка 15: | ||
== Код со сдвигом == | == Код со сдвигом == | ||
− | При использовании '''кода со сдвигом''' (''excess-''K) мы сдвигаем целочисленный отрезок от нуля до <tex> 2^{n} </tex> (<tex> n </tex> — количество бит) влево на <tex> 2^{n-1} </tex>, а затем последовательно кодируем получившееся на этом отрезке числа в порядке возрастания кодами от 000...0 до 111...1. | + | При использовании '''кода со сдвигом''' (''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. |
По сути, при таком кодировании: | По сути, при таком кодировании: | ||
Строка 36: | Строка 36: | ||
== Дополнительный код == | == Дополнительный код == | ||
− | + | Чаще всего для представления отрицательных чисел используется '''дополнительный код''' (дополнение до двух, англ. ''two's complement''). | |
− | + | Алгоритм получения дополнительного кода числа: | |
− | + | *если число положительное, то в старший разряд (который является знаковым) записывается ноль, далее записывается само число; | |
+ | *если число отрицательное, то все биты числа инвертируются, то есть все единицы меняются на нули, а нули — на единицы (получается '''обратный код'''), к инвертированному числу прибавляется единица, далее к результату дописывается знаковый разряд, равный единице. | ||
− | <tex> 2^n -</tex> | + | Также дополнительный код отрицательного числа <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>. |
− | + | Дополнительный код позволяет заменить арифметическую операцию вычитания операцией сложения, что существенно упрощает работу процессора и увеличивает его быстродействие. | |
− | + | ==Список литературы== | |
+ | *[http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_%28%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0%29 Википедия: Дополнительный код (представление числа)] | ||
− | + | *[http://en.wikipedia.org/wiki/Signed_number_representations Wikipedia: Signed number representations] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | *[http:// | ||
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
[[Категория: Представление информации]] | [[Категория: Представление информации]] |
Версия 02:59, 19 октября 2011
Прямой код
При записи числа в прямом коде (sign-and-magnitude method) старший разряд (most significant bit) является знаковым разрядом (sign bit). Если его значение равно нулю, то число положительное, если единице — отрицательное. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа.
Таким способом в
-битовом типе данных можно представить диапазон чисел .Достоинства метода:
- получить прямой код числа достаточно просто.
Недостатки:
- существуют два нуля ("+0" и "-0"), из-за чего усложняется арифметическое сравнение;
- выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора (например, для вычитания невозможно использовать сумматор, необходима отдельная схема для этого).
Из-за этого прямой код используется в основном только для записи неотрицательных чисел.
Код со сдвигом
При использовании кода со сдвигом (excess-
, где ; также говорят biased representation) мы сдвигаем целочисленный отрезок от нуля до ( — количество бит) влево на , а затем последовательно кодируем получившееся на этом отрезке числа в порядке возрастания кодами от 000...0 до 111...1.По сути, при таком кодировании:
- к кодируемому числу прибавляем ;
- переводим получившееся число в двоичную систему исчисления.
Можно получить диапазон значений
.Достоинства метода:
- нет проблемы двух нулей;
- не требуется усложнение архитектуры процессора.
Недостатки:
- при арифметических операциях нужно учитывать смещение, то есть проделывать на одно действие больше (например, после «обычного» сложения двух чисел у результата будет двойное смещение, одно из которых необходимо вычесть);
- ряд положительных и отрицательных чисел несимметричен.
Из-за необходимости усложнять арифметические операции код со сдвигом используется не часто.
Дополнительный код
Чаще всего для представления отрицательных чисел используется дополнительный код (дополнение до двух, англ. two's complement).
Алгоритм получения дополнительного кода числа:
- если число положительное, то в старший разряд (который является знаковым) записывается ноль, далее записывается само число;
- если число отрицательное, то все биты числа инвертируются, то есть все единицы меняются на нули, а нули — на единицы (получается обратный код), к инвертированному числу прибавляется единица, далее к результату дописывается знаковый разряд, равный единице.
Также дополнительный код отрицательного числа
, хранящегося в битах, равен . По сути, дополнительный код представляет собой дополнение до : так как в -разрядной арифметике (двоичная запись этого числа состоит из единицы и нулей, а в -разрядную ячейку помещаются только младших разрядов, то есть нулей), то верно равенство .Дополнительный код позволяет заменить арифметическую операцию вычитания операцией сложения, что существенно упрощает работу процессора и увеличивает его быстродействие.