Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_C-04.doc
Скачиваний:
1
Добавлен:
21.11.2019
Размер:
88.58 Кб
Скачать

Битовые флагами

Язык Си разрабатывался для системного программирования, в котором часто используются флаги — переменные, позволяющие фиксировать одно из двух состояний объекта, например, "включено–выключено", "доступно–недоступно", "скрыто–видимо" и т.п.

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

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

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

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

Чтобы выделить из представления числа первый байт, можно использовать операцию преобразования его адреса к типу unsigned char*, и затем применить к результату операцию разадресации.

Далее отдельные биты можно выделить с помощью масок.

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

Замечание

В персональных компьютерах с процессорами семейства Intell используется особый порядок записи байт в память. А именно, байты представления чисел записываются в память обратном порядке. На пример для двухбайтового представления сначала заносится младший байт, а потом старший.

При работе на уровне переменных программист этого не замечает, так как учет порядка — проблема компилятора. Это становится видно при побайтовом анализе данных, как в следующем задании.

ЗАДАНИЕ 4

1. Написать программу, которая поочередно выводит в шестнадцатеричной форме значения байтов представления переменной ul:

unsigned long ul=0x77BBCCDD.

Сообщения должны иметь вид строк "Byte 1: Znachenie ...").

Для выполнения задания нужно:

а) Определить в программе указатель pUL на тип unsigned long и присвоить ему адрес переменной ul.

б) Описать вспомогательный указатель pUC, на тип unsigned char.

в) Используя операцию приведения типа, присвоить указателю pUC преобразованное значение pUL.

г) Выполнить операцию разадресации для pUC, вывести значение полученного байта.

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

Контрольные вопросы

1. Какой максимальный размер объекта может вернуть операция sizeof в шестнадцатеричном компиляторе ВС 3.1?

2. Каким уровнем приоритета и какой ассоциативностью обладает операция sizeof?

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

4. В чем различие между неявными и явными преобразованиями типа?

5. Какие преобразования типов называются безопасными?

6. Можно ли применять преобразование типа, например, для значений "указатель на указатель" и что в результате будет получено?

7. Какая спецификация формата применяется для вывода с помощью функции printf адресов объектов?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]