Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
122 строки
3.4 KiB
C++
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;
|
|
}
|