Представление целых чисел: прямой код, код со сдвигом, дополнительный код — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
== Прямой код ==
 
== Прямой код ==
При записи числа в прямом коде (англ. ''sign-and-magnitude method'') старший разряд (англ. ''most significant bit'') является знаковым разрядом (англ. ''sign bit''). Если его значение равно 0, то число положительное, если 1 — отрицательное. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа.
+
При записи числа в '''прямом коде''' (''sign-and-magnitude method'') старший разряд (''most significant bit'') является знаковым разрядом (''sign bit''). Если его значение равно 0, то число положительное, если 1 — отрицательное. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа.
  
Получить прямой код числа достаточно просто, однако у этого метода есть ряд недостатков:
+
Таким способом в <tex> n </tex>-битовом типе данных можно представить диапазон чисел <tex> [-2^{n-1} + 1; 2^{n-1} - 1] </tex>.
 +
 
 +
Достоинства метода:
 +
*получить прямой код числа достаточно просто.
 +
 
 +
Недостатки:
  
 
*существуют два нуля ("+0" и "-0"), из-за чего усложняется арифметическое сравнение;
 
*существуют два нуля ("+0" и "-0"), из-за чего усложняется арифметическое сравнение;
Строка 10: Строка 15:
  
 
== Код со сдвигом ==
 
== Код со сдвигом ==
С помощью кода со сдвигом можно представить <tex> 2^n </tex> чисел. Суть кода в том, что мы сдвигаем целочисленный отрезок (от нуля до <tex> 2^{n} </tex>) влево на <tex> 2^{n-1} </tex>, а затем последовательно кодируем получившееся на этом отрезке числа , в порядке возрастаниякодами от 000...0 до 111...1
+
При использовании '''кода со сдвигом''' (''excess-''K) мы сдвигаем целочисленный отрезок от нуля до <tex> 2^{n} </tex> (<tex> n </tex> — количество бит) влево на <tex> 2^{n-1} </tex>, а затем последовательно кодируем получившееся на этом отрезке числа в порядке возрастания кодами от 000...0 до 111...1.
 +
 
 +
По сути, при таком кодировании:
 +
*к кодируемому числу прибавляем <tex> 2^{n-1} </tex>;
 +
*переводим получившееся число в двоичную систему исчисления.
 +
 
 +
Можно получить диапазон значений <tex> [-2^{n-1}; 2^{n-1} - 1]</tex>.
 +
 
 +
Достоинства метода:
 +
 
 +
*нет проблемы двух нулей;
 +
*не требуется усложнение архитектуры процессора.
 +
 
 +
Недостатки:
  
Принцип кодирования следующий:
+
*при арифметических операциях нужно учитывать смещение, то есть проделывать на одно действие больше (например, после «обычного» сложения двух чисел у результата будет двойное смещение, одно из которых необходимо вычесть);
*К кодируемому числу прибавляем <tex> 2^{n-1} </tex>
+
*ряд положительных и отрицательных чисел несимметричен.
*Переводим получившееся число в двоичную систему исчисления.
 
  
Диапазон значений [<tex>-2^{n-1} </tex>;<tex> 2^{n-1}-1 </tex>]
+
Из-за необходимости усложнять арифметические операции код со сдвигом используется не часто.
  
 
== Дополнительный код ==
 
== Дополнительный код ==

Версия 02:24, 19 октября 2011

Прямой код

При записи числа в прямом коде (sign-and-magnitude method) старший разряд (most significant bit) является знаковым разрядом (sign bit). Если его значение равно 0, то число положительное, если 1 — отрицательное. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа.

Таким способом в [math] n [/math]-битовом типе данных можно представить диапазон чисел [math] [-2^{n-1} + 1; 2^{n-1} - 1] [/math].

Достоинства метода:

  • получить прямой код числа достаточно просто.

Недостатки:

  • существуют два нуля ("+0" и "-0"), из-за чего усложняется арифметическое сравнение;
  • выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора (например, для вычитания невозможно использовать сумматор, необходима отдельная схема для этого).

Из-за этого прямой код используется в основном только для записи неотрицательных чисел.

Код со сдвигом

При использовании кода со сдвигом (excess-K) мы сдвигаем целочисленный отрезок от нуля до [math] 2^{n} [/math] ([math] n [/math] — количество бит) влево на [math] 2^{n-1} [/math], а затем последовательно кодируем получившееся на этом отрезке числа в порядке возрастания кодами от 000...0 до 111...1.

По сути, при таком кодировании:

  • к кодируемому числу прибавляем [math] 2^{n-1} [/math];
  • переводим получившееся число в двоичную систему исчисления.

Можно получить диапазон значений [math] [-2^{n-1}; 2^{n-1} - 1][/math].

Достоинства метода:

  • нет проблемы двух нулей;
  • не требуется усложнение архитектуры процессора.

Недостатки:

  • при арифметических операциях нужно учитывать смещение, то есть проделывать на одно действие больше (например, после «обычного» сложения двух чисел у результата будет двойное смещение, одно из которых необходимо вычесть);
  • ряд положительных и отрицательных чисел несимметричен.

Из-за необходимости усложнять арифметические операции код со сдвигом используется не часто.

Дополнительный код

Для представления отрицательных чисел используется дополнительный код. Дополнительный код позволяет заменить арифметическую операцию вычитания операцией сложения, что существенно упрощает работу процессора и увеличивает его быстродействие.

Дополнительный код отрицательного числа А, хранящегося в n ячейках, равен [math] 2^n-[/math] |A|.

Дополнительный код представляет собой дополнение модуля отрицательного числа А до 0, так как в n-разрядной компьютерной арифметике:

[math] 2^n -[/math] |А| + |А| = 0,

поскольку в компьютерной n-разрядной арифметике [math] 2^n [/math] = 0. Действительно, двоичная запись такого числа состоит из одной единицы и n нулей, а в n-разрядную ячейку может уместиться только n младших разрядов, то есть n нулей.

Для получения дополнительного кода отрицательного числа можно использовать довольно простой алгоритм:

  • Модуль числа записать в прямом коде в n двоичных разрядах.
  • Получить обратный код числа, для этого значения всех битов инвертировать (все единицы заменить на нули и все нули заменить на единицы).
  • К полученному обратному коду прибавить единицу.

Список литературы