logo search
Методичка

1.5.1 Двоичное представление целых чисел

Числа в компьютере могут быть беззнаковыми целые (unsigned integer), знаковыми целые (signed integer) и вещественными (real). Числа хранятся в регистрах, выполненных в виде совокупности триггеров. Каждый триггер хранит только один двоичный разряд (bit от английского binary digit) и может принимать одно из двух значений – 0 или 1. При изображении n-разрядного двоичного числа его биты принято нумеровать справа налево от 0 до n-1. Крайний левый бит является старшим, а крайний правый – младшим. Старший разряд носит своё название из-за того, что представляет самую большую по величине степень двойки. На рисунке 1.8 приведено десятичное число 155 в 8-разрядном двоичном представлении 10011011.

Беззнаковые целые числа

Беззнаковые целые (unsigned integer) могут быть только положительными либо равняться нулю. Согласно соотношению , гдеn – количество бит, а N – максимальное представимое число, чем большее количество битов отводится для представления числа, тем большее по величине беззнаковое целое число можно хранить в этих разрядах. Для удобства принято записывать двоичные числа в шестнадцатеричном представлении. В этом случае вместо каждых четырёх двоичных разрядов, называемых тетрадой, записывается только один шестнадцатеричный разряд, т.к. 24 = 16. Для обозначения символов 16-ричного алфавита используется десять цифр от 0 до 9, а также первые шесть букв латинского алфавита. Взаимнооднозначное соответствие между двоичными тетрадами и символами шестнадцатеричного алфавита представлено в таблице 1.1.

Таблица 1.1. Взаимнооднозначное соответствие между двоичными тетрадами и символами шестнадцатеричного алфавита

Двоичная

тетрада

Десятичное

число

Шестнадцатеричный

символ

0000

0

0

0001

1

1

0010

2

2

0011

3

3

0100

4

4

0101

5

5

0110

6

6

0111

7

7

1000

8

8

1001

9

9

1010

10

A

1011

11

B

1100

12

C

1101

13

D

1110

14

E

1111

15

F

Рассматривая двоичное число 10011011 из примера на рисунке 1.8 можно разбить его на тетрады, заменить их соответствующими символами 16-ричного алфавита и получить новое представление в шестнадцатеричном виде 9B (рис. 1.9).

Чем большее количество разрядов отводится для хранения двоичного числа, тем больше максимальное число, представимое этими разрядами. В таблице 1.2 приведены диапазоны возможных значений беззнаковых целых чисел в зависимости от разрядности чисел.

Таблица 1.2. Диапазоны возможных значений беззнаковых целых чисел.

Разрядность числа

Диапазон значений

Степень

двойки

Байт (8 бит)

0…255

0…(28-1)

Слово (16 бит)

0…65 535

0…(216-1)

Двойное слово (32 бита)

0…4 294 967 295

0…(232-1)

Учетверённое слово (64 бита)

0…18 446 744 073 709 551 615

0…(264-1)

При описании объёма памяти современных компьютеров и жёстких дисков обычно используют единицы измерения, перечисленные в таблице 1.3.

Таблица 1.3. Единицы измерения больших объёмов памяти.

Название

Обозна-

чение

Количество байтов

Килобайт (Kilobyte)

Кбайт (KB)

210 = 1024

Мегабайт (Megabyte)

Мбайт (MB)

220 = 1 048 577

Гигабайт (Gigabyte)

Гбайт (GB)

230 = 1 073 741 824

Терабайт (Terabyte)

Тбайт (TB)

240 = 1 099 511 627 776

Петабайт (Petabyte)

Пбайт (PB)

250 = 1 125 899 906 842 624

Эксабайт (Exabyte)

Эбайт (EB)

260 = 1 152 921 504 606 846 976

Зеттабайт (Zettabyte)

Збайт (ZB)

270 = 1 180 591 620 717 411 303 424

Йоттабайт (Yottabyte)

Йбайт (YB)

280 = 1 208 925 819 614 629 174 706 176

Арифметическое сложение осуществляется с помощью сумматора, представляющего собой комбинационную схему из базовых логических элементов “И”, “ИЛИ”, “НЕТ”. Сложение двух беззнаковых целых чисел выполняется, как и обычное сложение, поразрядно – от младшего разряда к старшему, т.е. справа налево. Каждая пара разрядов складывается между собой. При этом в результате сложения может получиться одно из четырёх значений, как показано в таблице 1.4.

Таблица 1.4. Результаты сложения двух одноразрядных двоичных чисел.

Операция

Бит результата

Бит переноса

0 + 0

0

0

0 + 1

1

0

1 + 0

1

0

1 + 1

0

1

Только в результате сложения двух единиц возникает перенос в следующий разряд. Если следующий разряд существует, то к сумме двух битов следующего разряда прибавится ещё единица – тот самый перенос. Если перенос возник в результате сложения старших разрядов, то сумма будет неверна, так как перенос не с чем складывать. Это событие называется переполнением разрядной сетки. Именно этим отличается обычная математика от математики, в которой числа хранятся в регистрах фиксированного размера – кремниевой математики.

На рисунке 1.10 показан пример сложения двух двоичных чисел 1001 и 1101 в четырёхразрядной арифметике. При сложении младших разрядов 1+1 возникает перенос, который прибавляется к сумме следующих разрядов 0+0+1. При сложении старших разрядов возникает перенос, вызывающий переполнение разрядной сетки. То есть для представления суммы необходим пятый разряд, который отсутствует в четырёхразрядной арифметике. Это ведёт к тому, что при сложении чисел 1001 и 1101 получается сумма 0110. Однако на самом деле сумма должна равняться 10110.

В “кремниевой” арифметике числовая ось на самом деле представляется окружностью. На рисунке 1.11 показаны беззнаковые четырёхразрядные числа от 0 до 15. На этом рисунке использовано десятичное и двоичное представление чисел. Если взять ноль за точку отсчёта и складывать его, например, с единицей, то через 15 операций сложения мы получим число 15, пройдя весь четырёхразрядный числовой ряд от 0 до 15. На шестнадцатом шаге, если число 15, которое имеет двоичное представление 1111, сложить с единицей, то в четырёхразрядной арифметике мы получим не 16, которое имеет пятиразрядное двоичное представление 10000, а ноль 0000. При этом возникнет переполнение разрядной сетки – та самая старшая единица числа 10000, для которой не хватило места в четырёхразрядном регистре нашей четырёхразрядной “кремниевой” арифметике.

Ограниченность разрядной сетки микропроцессоров не означает, что микропроцессоры не могут хранить и обрабатывать целые числа произвольной разрядности. Для этого каждое такое число хранится в смежных ячейках оперативной памяти, а загружается в микропроцессор и обрабатывается порциями. Размер порции равен разрядности регистров микропроцессора. Такой способ хранения и обработки целых чисел произвольной разрядности требует много вычислительных ресурсов (времени), но другого способа обработки чисел произвольной разрядности не существует, а увеличение разрядности регистров микропроцессоров ограничено технологическим процессом производства кристаллов.

Знаковые целые числа

Знаковые целые (signed integer) могут быть либо положительными, либо отрицательными. В знаковых числах самый старший разряд отводится для хранения информации о знаке числа: “0” – положительное число, “1” – отрицательное число.

На рисунке 1.12 приведён пример двоичного кода для представления отрицательного и положительного числа. Обратите внимание, что знаковый разряд не учитывается при определении модуля числа.

Такое представление чисел со знаком понятно для человека, но нерационально для компьютеров. Действительно, если сложить положительное число и такое же по модулю отрицательное число, то мы вправе ожидать нуля. Однако этого не будет. Попробуйте сами сложить два числа, изображённых на рисунке 1.12. Нуля не будет, потому что двоичный код для представления знаковых целых чисел не обладает свойством инверсии относительно сложения.

Выходит, для операции вычитания в АЛУ микропроцессора нужен новый функциональный блок – вычитатель? Или можно организовать вычитание с помощью уже имеющегося в АЛУ блока для сложения – сумматора? Оказывается можно. Для этого необходимо представлять целые числа со знаком в двоичном дополнительном коде. Числа представленные в этом коде обладают свойством инверсии относительно сложения. Это означает, что если сложить некоторое положительное число и его дополнительный код, то в результате получится ноль.

Использование дополнительного кода облегчает проектирование электронных схем АЛУ процессора, поскольку в этом случае две основные арифметические операции – сложение и вычитание могут выполняться с помощью одной схемы сумматора. При выполнении операции вычитания A – В процессор на самом деле складывает число А с числом В, представленным в двоичном дополнительном коде: А + (–В).

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

Табл. 1.5. Пример преобразования двоичного числа в дополнительный код

Начальное значение

00000011

Шаг 1. Инвертирование битов

11111100

Шаг 2. Прибавление 1

11111100

+00000001

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

11111101

Пример 1. Какое значение необходимо прибавить к двоичному числу 00000001, чтобы получить число 00000000? В терминах десятичного представления ответом будет -1. В двоичном представлении необходимо инвертировать все биты двоичного числа 00000001 и прибавить единицу, в результате чего получим число 11111111, которое является дополнительным кодом -1. А теперь прибавим к числу 1 дополнительный код числа -1:

1 00000001

+(-1) 11111111

0 (1)00000000

В результате получили ноль, что подтверждает инверсию дополнительного кода относительно сложения.

Операция получения дополнительного кода является взаимно обратимой. Это значит, что если представить положительное число в дополнительном коде и результат повторно представить в дополнительном коде, то получится исходное положительное число. Свойство взаимной обратимости даёт возможность определять модуль отрицательного числа путём нахождения его дополнительного кода.

На рисунке 1.13 показаны знаковые четырёхразрядные числа. Внутри круга числа представлены в десятичной системе счисления, снаружи круга – в двоичной.

Ряд двоичных чисел в дополнительном коде выглядит так:

-1 = 11111111

-2 = 11111110

-3 = 11111101

-4 = 11111100

Сравните его с рядом положительных чисел в двоичном коде:

0 = 00000000

1 = 00000001

2 = 00000010

3 = 00000011

Обратите внимание, что нулевые значения битов в двоичном дополнительном коде играют роль единичных значений битов обычного двоичного кода.

В двоичном целом n-разрядном числе со знаком для представления абсолютного значения числа может использоваться только n-1 битов. В таблице 1.6 приведены максимальные и минимальные значения для двоичных чисел со знаком.

Таблица 1.6. Допустимые диапазоны значений целых чисел со знаком

Тип числа

Диапазон значений

Степень двойки

Байт

-128 … +127

-27…(27-1)

Слово

-32 768 … +32 767

-215…(215-1)

Двойное слово

-2 147 483 648 … +2 147 483 647

-231…(231-1)

Учетверённое слово

-9 223 372 036 854 775 809 … +9 223 372 036 854 775 807

-263…(263-1)

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

Байтовая адресация

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

Обратным порядком байтов (big-endian) называется система адресации, при которой байты располагаются в памяти по принципу: чем старше байт числа, тем меньше его адрес, так что самый старший байт располагается по наименьшему адресу, а младший байт числа – по наибольшему адресу. Другими словами запись числа в память начинается со старшего байта числа и заканчивается младшим байтом. Этот порядок является стандартным для протоколов TCP/IP, он используется в заголовках пакетов данных и во многих протоколах более высокого уровня, разработанных для использования поверх TCP/IP. Поэтому, порядок байтов от старшего к младшему часто называют сетевым порядком байтов (англ.network byte order). Этот порядок байтов используется процессорами IBM 360/370/390,Motorola 68000,SPARC(отсюда третье название — порядок байтов Motorola, Motorola byte order).

Например, двойное слово 12345678h содержит четыре байта 12h, 34h, 56h и 78h. Байт 12h является старшим, байт 78h – младшим. При записи числа в память компьютера по адресу, например 200, байты этого числа будут записаны в обратном порядке: в ячейку памяти с меньшим адресом 200 будет помещён старший байт 12h, а в ячейку памяти с наибольшим адресом 2003 – младший байт 78h.

Прямым порядком байтов (little-endian) называется система адресации, при которой байты располагаются в памяти по принципу: чем старше байт, тем больше его адрес, так что самый старший байт располагается по наибольшему адресу. Другими словами запись числа в память начинается с младшего байта числа и заканчивается старшим байтом. Этот порядок записи принят в памяти персональных компьютеров с x86-процессорами, в связи с чем, иногда, его называют интеловский порядок байтов (по названию компании-создателя архитектуры x86). Также прямой порядок байтов используется в процессорах Z80, VAX.

Например, при записи числа 12345678h в память компьютера по адресу, например 200, байты этого числа будут записаны в прямом порядке: в ячейку памяти с меньшим адресом 200 будет помещён младший байт 78h, а в ячейку памяти с большим адресом 203 – старший байт 12h.

Смешанный порядок байтов (middle-endian)используется при работе с числами, длина которых превышает машинное слово. Смешанным порядком байтов называется система адресации, при которой байты каждого слова размещаются в памяти компьютера в прямом порядке, а слова, составляющие число – в обратном порядке. Смешанный порядок байтов используется в процессорах семейства IA‑64, SPARC V9, PowerPC.

Например, число 12345678h содержит старшее слово 1234h и младшее слово 5678h. При записи числа 12345678h в память компьютера по адресу, например 200, слова 1234h и 5678h будут записаны в обратном порядке, то есть старшее слово 1234h будет записано в ячейки с меньшими адресами 200 и 201, а младшее слово 5678h будет записано в ячейки со старшими адресами 202 и 203. При этом байты каждого слова будут записаны в прямом порядке, то есть байты 12h и 34h будут записаны в ячейки с адресами 201 и 200 соответственно, а байты 56h и 78h – в ячейки с адресами 203 и 202 соответственно.

Переключаемый порядок байтов (bi-endian) допускает использование или прямого или обратного порядка записи байтов. Обычно порядок байтов выбирается программно во время инициализации операционной системы, но может быть выбран и аппаратно перемычками на системной плате. В этом случае правильнее говорить о порядке байтов операционной системы.

Процессоры семейства IA‑64, ARM, PowerPC (но не PowerPC 970), DEC Alpha, MIPS, PA-RISC допускают программное переключение системы адресации байтов.

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

Термины big-endian и little-endian первоначально не имели отношения к информатике. В сатирическом произведении Джонатана Свифта «Путешествия Гулливера» описываются вымышленные государства Лилипутия и Блефуску, в течение многих лет ведущие между собой войны из-за разногласия по поводу того, с какого конца следует разбивать варёные яйца. Тех, кто считает, что их нужно разбивать с тупого конца, в произведении называют «Big-endians» («тупоконечники»), а тех, кто считает, что их нужно разбивать с острого конца, в произведении называют «Little-endians» («остроконечники»).