1х2 3+1х2 :+0х2 1+1х2°
В десятичной записи это становится следующим:
1x8+1x4+0x2+1x1=13
В двоичной системе можно представить любое целое число (при достаточном количестве битов) в форме комбинации нулей и единиц. Эта система очень удобна для цифровых вычислительных систем, у которых информация выражается в виде комбинаций включенных и выключенных состояний, что можно интерпретировать как единицы и нули. Давайте посмотрим, как двоичная система работает с однобайтовым целым числом.
Манипулирование битами 629
Двоичные целые числа
Обычно байт содержит 8 битов. Вспомните, что в языке С термин байт применяется для обозначения размера памяти, используемой для хранения набора символов системы, поэтому в С байт может содержать 8, 9, 16 и другое количество битов. Однако в характеристиках модулей памяти и систем передачи данных предполагается, что байт содержит 8 битов. Чтобы излишне не усложнять, в этой главе предполагается 8-битовый байт. (Для ясности в мире вычислений 8-битовый байт часто обозначается термином октет.) Можно считать, что биты в байте пронумерованы справа налево с 0 до 7. Седьмой бит называется старшим, а нулевой бит — младзинм. Каждый номер бита соответствует определенной степени числа 2. Такое представление байта иллюстрируется на рис. 15.1.

Рис. 15,1. Номера и значения битов
Здесь значение 128 представляет собой 2 в степени 7 и т.д. Байт имеет наибольшее значение, когда все его биты установлены в 1: 11111111. Значение этого двоичного числа определяется следующим образом:
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
Наименьшему значению соответствует комбинация 00000000, или просто 0. Байт может хранить числа от 0 до 255, что составляет 256 возможных значений. Или, интерпретируя комбинацию битов по-другому, программа может применять байт для хранения чисел от -128 до 127, что также дает 256 возможных значений. Например, тип unsigned char обычно применяет байт для представления диапазона чисел от 0 до 255, а тип signed char — для диапазона от -128 до 127.
Целые числа со знаком
Представление целых чисел со знаком определяется оборудованием, а не языком С. Пожалуй, самый простой способ представления чисел со знаком заключается в резервировании бита, такого как старший, для обозначения знака. В однобайтовом значении для представления самого числа остается 7 битов. В таком представлении величины со знаком комбинация 10000001 будет соответствовать числу -1, а комбинация 00000001 — числу 1. Тогда диапазон представляемых значений будет простираться от -127 до+127.
Один из недостатков такого подхода состоит в возможности двоякого представления нуля: +0 и -0. Это вызывает путаницу и приводит к использованию двух комбинаций битов для представления одного значения.
Метод дополнения до двух устраняет эту проблему, и в настоящее время он распространен наиболее широко. Мы обсудим его применительно к однобайтовому значению. В данном контексте значения от 0 до 127 представляются последними семью битами со старшим битом, установленным в 0. Пока что нет отличий от представления
630 глава 15 величины со знаком. Точно так же, если старший бит равен 1, то число является от рицательным. Отличие начинается при определении значения этого отрицательного числа. Для этого понадобится вычесть комбинацию битов отрицательного числа из 9-битовой комбинации 100000000 (двоичного представления числа 256), в результате получив модуль значения. Для примера предположим, что комбинация имеет вид 10000000. Как байт без знака, это соответствует числу 128. Как значение со знаком, оно является отрицательным (бит 7 равен 1) и имеет величину 100000000-10000000, или 10000000 (т.е. 128). Следовательно, число равно -128. (В представлении величины со знаком оно было бы равно -0.) Подобным же образом, комбинация 10000001 соответствует значению -127, а комбинация 11111111 — значению -1. Данный метод позволяет представлять числа в диапазоне от -128 до 127.
Простейший способ смены знака двоичного числа, которое представлено методом дополнения до 2, предусматривает инвертирование каждого бита (превращение 0 в 1 и 1 в 0) и затем добавление 1. Поскольку 1 — это 00000001, то -1 соответствует 11111110 + 1, или 11111111, как уже было показано.
Метод дополнения до единицы формирует отрицательное число путем инвертирования каждого бита в комбинации. Например, комбинация 000000001 — это 1, а 11111110 — значение-1. Этот метод также имеет -0: 11111111. Диапазон представляемых чисел (для однобайтового значения) составляет от -127 до +127.
Читать дальше