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

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

.docx
Скачиваний:
0
Добавлен:
01.09.2026
Размер:
871 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное автономное образовательное учреждение высшего образования

«Национальный исследовательский ядерный университет «МИФИ»

Кафедра экспериментальной ядерной физики и космофизики (№7)

Программирование на С и С++

Отчет по лабораторной работе № 6

Выполнил:

студент группы 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.

Благодаря объединению доступ к одной и той же области памяти может осуществляться как к целому или к отдельным частям этой области. Именно это и использовалось в работе для получения требуемых байтов исходного числа.

Данная задача была решена ранее с использованием механизма указателей и приведения типов, но её решение с помощью объединения проще и лаконичнее.