Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
15
Манипулирование
битами
В ЭТОЙ ГЛАВЕ...
• Операции: &, |,^, », <<, &=, | =, ^=, >>=, << =
• Обзор двоичной, восьмеричной
и шестнадцатеричной систем счисления
• Два средства языка С для обработки отдельных битов значения: побитовые операции и битовые поля
• Ключевые слова: _Alignas, _Alignof
628 глава 15
Я
зык С позволяет управлять индивидуальными битами значения переменной.
Может возникнуть вопрос: для чего это нужно? Не сомневайтесь, что иногда такая возможность необходима или, по крайней мере, удобна. Примером может служить управление некоторым физическим устройством, что часто связано с передачей нескольких битов, причем каждый из них имеет определенный смысл. Кроме того, информация о файлах в операционной системе обычно хранится в виде определенных битов, указывающих на отдельные элементы. Многие операции сжатия и шифрования связаны с управлением битами. Языки высокого уровня, как правило, не обеспечивают такого уровня детализации. Способность совмещать возможности языка высокого уровня с операциями на уровне, который обычно оставляется за языком ассемблера, делает С предпочтительным выбором для написания драйверов устройств и встраиваемого кода.
В этой главе мы исследуем возможности языка С по работе с битами, первоначально ознакомившись с понятиями бита, байта, двоичной и других систем счисления.
Двоичные числа, биты и байты
Обычная форма записи чисел основана на числе 10. Например, число 2157 в позиции тысяч содержит цифру 2, в позиции сотен — 1, в позиции десятков — 5, а в позиции единиц — 7. Это означает, что число 2157 можно рассматривать следующим образом:
2 х 1000 +1x100+5x10+7x1!
Принимая во внимание, что 1000 — это 10 в кубе, 100 — это десять в квадрате, 10 - 10 в первой степени, а 1 — это 10 (как и любое другое положительное число) в нулевой степени, число 2157 можно записать так:
2 х 10 3+ 1 х 10 2+ 5 х 10 1+ 7 х 10 0!
Поскольку привычная система записи чисел основана на степенях 10, мы говорим, что число 2157 записано по основанию 10.
Люди пользуются десятичной системой счисления потому, что у них на руках 10 пальцев. Тогда будем считать, что у бита только два пальца, т.к. он может быть установлен лишь в 0 или 1 (выключен или включен). Таким образом, для компьютера естественной является двоичная система счисления. В ней для записи чисел используются степени 2, а не 10. Числа, выраженные по основанию 2, называют двоичными. Число 2 играет такую же роль в двоичной системе, как число 10 в десятичной. Например, двоичная запись 1101 означает:
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, как уже было показано.
Читать дальшеИнтервал:
Закладка: