#include #include #include #include #include #include // Добавлено для работы с кодировкой // Структура с битовым полем и обязательными атрибутами struct Student { char name[17]; uint16_t year; float gpa; uint8_t gender : 1; // 0 — жен, 1 — муж uint8_t courses : 7; Student* captain; }; // Печать одного байта в hex static void print_in_hex(uint8_t byte) { static const char digits[] = "0123456789ABCDEF"; std::cout << digits[byte >> 4] << digits[byte & 0x0F]; } // Печать блока в hex с разрывом строк каждые 16 байт static void print_in_hex(const void* data, size_t size) { const uint8_t* bytes = static_cast(data); for (size_t i = 0; i < size; ++i) { print_in_hex(bytes[i]); if (i + 1 != size) { std::cout << ' '; } if ((i + 1) % 16 == 0 && i + 1 != size) { std::cout << '\n'; } } } // Печать одного байта в двоичном виде static void print_in_binary(uint8_t byte) { for (int bit = 7; bit >= 0; --bit) { std::cout << ((byte >> bit) & 1); } } // Печать блока в двоичном виде с переводом строки каждые 4 байта static void print_in_binary(const void* data, size_t size) { const uint8_t* bytes = static_cast(data); for (size_t i = 0; i < size; ++i) { print_in_binary(bytes[i]); if (i + 1 != size) { std::cout << ' '; } if ((i + 1) % 4 == 0 && i + 1 != size) { std::cout << '\n'; } } } int main() { // Настройка кодировки консоли для русского текста SetConsoleOutputCP(1251); SetConsoleCP(1251); Student group[3]{}; // Староста strcpy_s(group[0].name, "Smirnov Denis"); // Исправлено group[0].year = 2022; group[0].gpa = 4.6f; group[0].gender = 1; group[0].courses = 3; group[0].captain = nullptr; // Студентки strcpy_s(group[1].name, "Kuznetsova Al"); // Исправлено group[1].year = 2022; group[1].gpa = 4.9f; group[1].gender = 0; group[1].courses = 3; group[1].captain = &group[0]; strcpy_s(group[2].name, "Belova Irina"); // Исправлено group[2].year = 2021; group[2].gpa = 4.3f; group[2].gender = 0; group[2].courses = 4; group[2].captain = &group[0]; std::cout << "1) Массив студентов\n"; std::cout << " Адрес: " << static_cast(group) << '\n'; std::cout << " Размер: " << sizeof(group) << " байт\n\n"; std::cout << "2) Элементы массива\n"; for (int i = 0; i < 3; ++i) { std::cout << " #" << i << " адрес: " << static_cast(&group[i]) << " размер: " << sizeof(Student) << " байт\n"; } std::cout << '\n'; std::cout << "3) Поля второго студента (без пола)\n"; std::cout << " name\n"; std::cout << " адрес: " << static_cast(group[1].name) << '\n'; std::cout << " смещение: " << offsetof(Student, name) << '\n'; std::cout << " размер: " << sizeof(group[1].name) << " байт\n"; std::cout << " hex:\n"; print_in_hex(group[1].name, sizeof(group[1].name)); std::cout << "\n bin:\n"; print_in_binary(group[1].name, sizeof(group[1].name)); std::cout << "\n\n"; std::cout << " year\n"; std::cout << " адрес: " << static_cast(&group[1].year) << '\n'; std::cout << " смещение: " << offsetof(Student, year) << '\n'; std::cout << " размер: " << sizeof(group[1].year) << " байт\n"; std::cout << " hex:\n"; print_in_hex(&group[1].year, sizeof(group[1].year)); std::cout << "\n bin:\n"; print_in_binary(&group[1].year, sizeof(group[1].year)); std::cout << "\n\n"; std::cout << " gpa\n"; std::cout << " адрес: " << static_cast(&group[1].gpa) << '\n'; std::cout << " смещение: " << offsetof(Student, gpa) << '\n'; std::cout << " размер: " << sizeof(group[1].gpa) << " байт\n"; std::cout << " hex:\n"; print_in_hex(&group[1].gpa, sizeof(group[1].gpa)); std::cout << "\n bin:\n"; print_in_binary(&group[1].gpa, sizeof(group[1].gpa)); std::cout << "\n\n"; std::cout << " captain\n"; std::cout << " адрес: " << static_cast(&group[1].captain) << '\n'; std::cout << " смещение: " << offsetof(Student, captain) << '\n'; std::cout << " размер: " << sizeof(group[1].captain) << " байт\n"; std::cout << " hex:\n"; print_in_hex(&group[1].captain, sizeof(group[1].captain)); std::cout << "\n bin:\n"; print_in_binary(&group[1].captain, sizeof(group[1].captain)); std::cout << "\n\n"; std::cout << "4) Структуры в hex\n"; for (int i = 0; i < 3; ++i) { std::cout << " Студент #" << i << (i == 0 ? " (староста)" : "") << '\n'; std::cout << " все поля:\n"; print_in_hex(&group[i], sizeof(Student)); std::cout << '\n'; std::cout << " name:\n"; print_in_hex(&group[i].name, sizeof(group[i].name)); std::cout << '\n'; std::cout << " year:\n"; print_in_hex(&group[i].year, sizeof(group[i].year)); std::cout << '\n'; std::cout << " gpa:\n"; print_in_hex(&group[i].gpa, sizeof(group[i].gpa)); std::cout << '\n'; uint8_t packed = static_cast((group[i].gender << 7) | group[i].courses); std::cout << " gender+courses (байт):\n"; print_in_hex(&packed, sizeof(packed)); std::cout << '\n'; std::cout << " captain:\n"; print_in_hex(&group[i].captain, sizeof(group[i].captain)); std::cout << "\n\n"; } return 0; }