В компьютерных науках знаковый бит или знаковый разряд(англ. sign bit) это бит, обозначающий знак числа[1]. Знаковый бит имеют лишь числовые типы со знаком[uk], он неизменно находится в позиции старшего бита, в определённых контекстах термин «знаковый бит» употребляют в смысле «старший бит». Обычно, если знаковый бит равен 0, число неотрицательное (положительное или ноль), а если знаковый бит 1, тогда число отрицательное[1]. Такой нотации знака числа придерживаются наиболее распространённые в вычислительной технике прямой (англ. sign-and-magnitude), обратный (англ. one's complement) и дополнительный (англ. two's complement) коды чисел.

Знаковый бит двоичного числа

В схемах обработки чисел с плавающей запятой, в отличие от схем с фиксированной запятой, во время представления чисел нужны два знаковых разряда: один — для представления знака мантиссы, другой — для представления знака порядке. Если используется модифицированный обратный и дополняющий код знак числа также изображается как двухразрядный код «00», в случае неотрицательных чисел, и как код «11» — в случае отрицательных чисел. Это даёт возможность легко определять ситуацию, при которой произошло переполнение разрядной сетки машины (признаком переполнения является наличие кода «01» или кода «10» в знаковом разряде).

Во время выполнения операций сложения (вычитания) знак результата получается автоматически, поскольку в операции участвуют не сами числа, а их коды (включая код знака). Во время выполнения операций умножения (деления) знак результата определяется суммированием кодов знакового разряда множимого и множителя (делимого и делителя) по mod 2.

Диапазон представления чисел со знаком править

Поскольку старший разряд числа отвечает за знак, только n-1 разрядов могут быть использованы как цифровые разряды числа[2]. Таким образом, однобайтовые числа со знаком имеют только 7 цифровых битов, двухбайтовые числа имеют, соответственно, 15 цифровых битов и т. д. В прямом и обратном кодах диапазон представления чисел располагается симметрично относительно нуля, то есть количество отрицательных чисел равно количеству положительных чисел. Например, однобайтовый прямой и обратный коды могут представить числа в диапазоне -127 ... + 127. В этих кодах имеет место так называемый «ноль со знаком», то есть различные представления для номеров «плюс ноль» и «минус ноль», последний из которых не соответствует математической концепции отрицательного числа . В дополнительном коде ноль имеет только один код, поэтому диапазон представления чисел несимметричный относительно нуля. Так, однобайтовый дополнительный код представляет числа в диапазоне -128 ... + 127.

Изменение знака числа в разных кодах править

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

+58 = 00111010 
–58 = 10111010

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

+58 = 00111010
–58 = 11000101

В дополнительном коде знаковый бит обозначает знак числа, цифровые биты положительного числа содержат цифры числа, а отрицательного числа — дополнение к 2n, где n — количество цифр. На практике для получения дополнительного кода числа добавляют 1 к обратному коду. Для изменения знака числа в дополнительном коде нужно инвертировать все биты числа и прибавить 1.

+58 = 00111010
      11000101
            +1
–58 = 11000110

Числа с плавающей запятой, такие как формат IEEE, формат IBM[en], формат VAX и даже формат, используемый в машинах Цузе Z1 и Z3, используют представления чисел в прямом коде. Для изменения знака числа достаточно изменить знаковый бит.

Расширение знака править

Если необходимо привести число в дополнительном коде к более широкому формату, не меняя его числового значения (например, с одного до двух байтов), то дополнительные старшие биты должны быть заполнены копией знакового бита, этот процесс называется расширением знака[3] или размножением знака. Например, однобайтовое положительное двоичное число 00111010, расширенное до двух байтов, записывается в дополнительном коде как 00000000.00111010, а отрицательное число 11000110 как 11111111.11000110.

Процессоры семейства x86 имеют специальные команды расширения знака CBW (Convert Byte to Word), CWD и CWDE (Convert Word to Doubleword), CDQ (Convert Doubleword to Quadword)) и универсальную команду MOVSX (Move with Sign-Extension), предназначенные для автоматического увеличения формата числа.

См. также править

Примечания править

  1. 1 2 Ковалюк Т.В. Основи програмування. – 2005.
  2. David Tarnoff. Computer Organization and Design Fundamentals. – 2011.
  3. Рудольф Марек. Ассемблер на примерах. – 2005. – C. 46.

Источники править

  • Ковалюк Т.В. Основы программирования. — Киев: Издательская группа BHV, 2005. — 384 с. — ISBN 966-552-138-1.
  • Рудольф Марек. Ассемблер на примерах. Базовый курс. — СПб.: Наука и Техника, 2005. — 240 с. — ISBN 5-94387-232-9.
  • David Tarnoff. Computer Organization and Design Fundamentals. — 2011. — 432 с. — ISBN 9781411636903.