Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование C++ (1 сем, мага) / Лабы / Лабораторная работа №6

.pdf
Скачиваний:
0
Добавлен:
01.09.2026
Размер:
329 Кб
Скачать
Министерство науки и высшего образования Российской Федерации
Федеральное государственное автономное образовательное учреждение высшего
образования
«Национальный исследовательский ядерный университет «МИФИ»
Кафедра экспериментальной ядерной физики и космофизики (№7)
Программирование на С и С++
Выполнил: студент группы M22-105 Васильева А.П.
Москва, 2022
Цель работы: знакомство с объединением (UNION) и решение задачи путем
использования UNION.
Задача: исходное число: AABBCCDD. Требуется получить BBCC с помощью
объединения (UNION).
Введение
UNION, объединение — один из примеров составных типов данных, называемых
агрегатными типами. Объединения содержат поля различных типов, но помещаемых в одно и то же место памяти, т.е. осуществляется доступ к одному и тому же месту памяти, но по-разному. Все поля объединения начинаются с одной границы. Длиной объединения является максимальная из длин отдельных полей шаблона. Различают шаблон объединения
и переменную, созданную по шаблону. Объединение может инициализироваться только
первым описанным полем. Доступ к полям объединения выполняется через селектор поля ‘.’, либо ссылка формируется операцией ‘->’, если для доступа используется указатель на объединение.
Применение объединений:
доступ к одной и той же области памяти либо как к целому, либо к отдельным частям;
формирование целого из частей, например, far-указателя по известным значениям
смещения и сегмента;
экономия динамической памяти.
Ход работы
Код программы:
Переменной block типа unsigned long присваивается значение AABBCCDD:
Создан шаблон объединения bytes, первое поле которого wholeNumber имеет тип данных unsigned long, а второе поле byte[4] представляет собой массив из четырех элементов типа unsigned char. При этом размер unsigned long wholeNumber – 4 байта, размер массива unsigned char bytes[4] – так же 4 байта.
Далее по шаблону bytes создана переменная blockUnion и выполнена инициализация – полю wholeNumber присваивается значение переменной block. В результате объединение blockUnion выглядит следующим образом:
Величина 0xAABBCCDD хранится в памяти как число типа unsigned long и в то же время, к каждому из байтов этого числа можно обратиться как к элементу массива типа unsigned char, размер которого равен 4.
Обращения &blockUnion.wholeNumber и &blockUnion.byte указывают на одну и ту же ячейку памяти:
Конечное число 0xBBCC должно занимать два байта, поэтому далее работа шла с переменными типа unsigned short. Выполнено преобразование
blockUnion.byte[2] к типу unsigned short и побитовый сдвиг влево на 8 битов (1 байт). В результате получено число 0xBB00, которое было сохранено в переменную bbcc.
Далее значение blockUnion.byte[1] преобразовано к типу unsigned short и прибавлено к значению переменной bbcc:
Таким образом получено значение 0xBBCC.
Задачу можно решить и иначе. Код программы, представляющей собой альтернативный
способ решения:
Переменной block типа unsigned long также присваивается значение
0xAABBCCDD:
Снова создается шаблон объединения bytes, первое поле которого по-прежнему имеет тип unsigned long, а второе поле объединения теперь представляет собой массив из двух элементов типа unsigned short. Далее по шаблону bytes создается переменная blockUnion и выполняется её инициализация – полю wholeNumber присваивается значение переменной block, но при этом выполняется сдвиг вправо на 8 бит:
Теперь требуемое число 0xBBCC можно получить как blockUnion.byte[0]. Именно это значение присваивается переменной bbcc:
Это был второй способ получения требуемой последовательности байт исходного числа
с помощью объединения.
Заключение
В лабораторной работе решена задача по получению нового числа путем выделения определенных байтов исходного с помощью объединения UNION.
Благодаря объединению доступ к одной и той же области памяти может осуществляться
как к целому или к отдельным частям этой области. Именно это и использовалось в работе для получения требуемых байтов исходного числа.
Данная задача была решена ранее с использованием механизма указателей и приведения
типов, но её решение с помощью объединения проще и лаконичнее.