Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

122 строки
3.4 KiB
C++

#include <iostream>
#include <cstddef>
#include <cstdlib>
#include <cstring>
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;
}