#include #include #include #include using namespace std; void print_in_hex(uint8_t byte) { printf("%02X ", byte); } void print_in_hex(const void* data, size_t size) { const uint8_t* bytes = (const uint8_t*)data; for (size_t i = 0; i < size; i++) { print_in_hex(bytes[i]); if ((i + 1) % 8 == 0) printf("\n"); } printf("\n"); } void print_in_binary(uint8_t byte) { for (int i = 7; i >= 0; i--) { printf("%d", (byte >> i) & 1); if (i % 8 == 0) printf(" "); } } void print_in_binary(const void* data, size_t size) { const uint8_t* bytes = (const uint8_t*)data; for (size_t i = 0; i < size; ++i) { print_in_binary(bytes[i]); if ((i + 1) % 8 == 0) printf("\n"); } } #pragma pack(1) struct Student { char _name[17]; uint16_t _year; float _averageGrade; uint8_t _gender : 1; // 0 - female, 1 - male uint8_t _numCourses : 7; Student* _leader; }; #pragma pack() int main() { Student students[3] = {0}; strcpy(students[0]._name, "Alex"); students[0]._year = 2021; students[0]._averageGrade = 3.7f; students[0]._gender = 1; students[0]._numCourses = 6; students[0]._leader = nullptr; strcpy(students[1]._name, "Masha"); students[1]._year = 2020; students[1]._averageGrade = 4.6f; students[1]._gender = 0; students[1]._numCourses = 4; students[1]._leader = &students[0]; strcpy(students[2]._name, "John"); students[2]._year = 2021; students[2]._averageGrade = 4.1f; students[2]._gender = 1; students[2]._numCourses = 5; students[2]._leader = &students[0]; cout << "Array address: " << &students << endl; cout << "Array size: " << sizeof(students) << " byte" << endl; for (int i = 0; i < 3; i++) { cout << "Element address " << i << ": " << &students[i] << endl; cout << "Element Size " << i << ": " << sizeof(students[i]) << " byte" << endl; } int index = 1; Student& student = students[index]; cout << "Student information " << index << ":" << endl; cout << "Field value _name: " << student._name << endl; cout << "Field address _name: " << &(student._name) << endl; cout << "Field offset _name from the beginning of the structure: " << offsetof(Student, _name) << " byte" << endl; cout << "Field size _name: " << sizeof(student._name) << " byte" << endl; cout << "Hexadecimal representation of the field _name:" << endl; print_in_hex(student._name, sizeof(student._name)); cout << "Binary field representation _name:" << endl; print_in_binary(student._name, sizeof(student._name)); cout << endl; cout << "Array elements in hexadecimal:" << endl; cout << "(First " << sizeof(student._name) << " byte - field _name):" << endl; cout << "(Next " << sizeof(student._year) << " bytes - field _year):" << endl; cout << "(Next " << sizeof(student._averageGrade) << " bytes - field _averageGrade):" << endl; cout << "(Next " << sizeof(uint8_t) << " bytes - 1 bit for _gender and 7 bit for _numCourses):" << endl; cout << "(Next " << sizeof(student._leader) << " bytes - field _leader):" << endl; for (int i = 0; i < 3; i++) { cout << "Student with index " << i << endl; print_in_hex(&students[i], sizeof(students[i])); } system("pause"); return 0; }