МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Звіт
"Представлення в пам’яті комп’ютера
статичних даних"
до курсової роботи (Частина 1)
з дисципліни
" Програмування. Частина III.
Структури даних та алгоритми "
Львів – 2011
Завдання на курсову роботу
3.1. Завдання 1
Визначити внутрішнє представлення в пам’яті комп’ютера даних базових типів. Розглянути основні прості (цілі, дійсні, символьні, логічні) типи даних:
Стовпчик = (місяць народження студента) % 5=1
Рядок = (день народження студента) % 6=2
Варант(1;2)= b,ch2,i6,d1
bool b;
unsigned char ch2;
long i6;
float d1;
b = (день народження * 5) % 10 * місяць народження = (26 * 5) % 10 * 11 = 15;
ch2 = друга літера прізвища = ‘u’;
i6 = день народження * 215 = 26 * 215 = -9152;
d1 = – Z . X e – Y;
X – день народження, Y – місяць народження, Z = X * Y;
Х = 26; Y = 11; Z = X * Y = 11 *26 = 286;
d1 = – 286 . 26e – 11;
3.2.1. Представлення рядків символів
№ варіанта = (((день народження * номер будинку) % номер квартири) * місяць народження + номер будинку) % 30=(26*56) %11)*11+56) % 30=10
char *string10 = "fsggg4\x11 4vv\vnn n\"df""\\\?6\6";
3.2.2. Представлення переліків
№ варіанта = ((день народження + номер будинку) * (номер квартири + місяць народження)) % 30=((26+56)*(11+11)) %30=4
enum color4 {
BLUE,
GREEN,
CYAN = 9,
RED,
BROWN,
GRAY,
YELLOW = -1,
WHІTE,
MAGENTA,
LІGHTGRAY,
DARKGRAY = 2,
BLACK
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY;
3.2.3. Представлення масивів
№ варіанта = (номер будинку * 10 + номер квартири * місяць народження) % 30 = (56 * 10 + 11 * 11) % 30 = 21.
unsigned short array21[][3][2] = {{{}, 15,2,8,5}, {}, 34}
3.2.4. Представлення структур
№ варіанта = (день народження * 3 * номер квартири + (місяць народження % 3) * номер будинку) % 30=(26*3*11+(11%3)*56)%30=10
struct str10 {
short :10;
char c[8];
long :12;
short b:8;
unsigned e:3;
float a;
char f;
unsigned long d;
}str;
3.2.5. Представлення об'єднань
Визначити представлення в пам’яті комп’ютера об'єднань.
№ варіанта = (день народження + місяць народження + номер квартири * номер будинку + день народження * місяць народження) % 30 = (26+ 11 + 11 * 56 + 26 * 11) % 30 = 9.
Оголосити об'єднання згідно наведеній нижче таблиці. Після цього надати деяким елементам об'єднання початкові значення, задані після таблиці.
union un9 {
char a[9];
unsigned f[5];
struct {
bool d;
short b;
double e;
};
char c;
} un;
un.e = 55367;
un.c = 174200;
un.e = KV * 325 + YEAR * DN = 55367;
un.c = DN * (MN + BD) * 100 = 174200;
Зміст
Завдання на курсову роботу
Вступ
Теоретична частина
Алгоритм розв’язання задачі.
Система тестів
Завдання 1: Внутрішні формати базових типів
3.1.1. Логічний тип
3.1.2. Символьний тип
3.1.3. Цілий тип
3.1.4. Дійсний тип
Завдання 2: Внутрішні формати похідних типів
3.2.1. Рядок символів
3.2.2. Перерахування
3.2.3. Масив
3.2.4. Структура
3.2.5. Об'єднання
Результати виконання програми
Висновки
Список літератури
Додатки
Вступ
Програма, написана на будь-якій мові програмування, є деякою описаною послідовністю операцій, котрі необхідно виконати з деякою сукупністю даних. В свою чергу будова конкретної обчислювальної машини і особливості трансляторів визначають внутрішнє представлення даних ( їх розміщення в пам’яті ЕОМ. Ці факти свідчать про те, що організація даних для обробки є важливим етапом розробки програмних продуктів, а проблема структур даних та алгоритмів роботи з ними є актуальною проблемою.
Для реалізації багатьох програм вибір структури даних є найважливішим рішенням, і коли вибір зроблено правильно, то розробка алгоритму програми значно спрощується. Для одних і тих самих даних різні структури будуть займати неоднаковий дисковий простір; ті самі операції з різними структурами даних створюють алгоритми різної ефективності. Тобто вибір алгоритмів та структур даних тісно взаємопов’язані і найчастіше поняття структури даних включає алгоритми роботи з даною структурою.
Важливим є кожен рівень представлення даних. Наприклад, обрана математична модель може не в цілому або не точно відображати властивості реальних об’єктів і існуючі між ними зв’язки. В свою чергу, синтаксис окремої алгоритмічної мови може значно обмежувати можливості опису логічної структури даних, або ж робить ці описи складними і громіздкими. Неможливим або неефективним виконання синтаксично (і семантично) правильної програми можуть зробити характеристики комп’ютера (малий об’єм пам’яті, низька швидкодія). Тому структури даних та їх внутрішнє представлення, а також зв’язки між ними є одним з важливих питань в програмуванні.
Ефективність роботи алгоритмів залежить не лише від структури даних, яка використовується, але й від того, як дана структура розміщена. Звичайно, оперуючи великими кількостями інформації, бажано щоб вона була певним чином відсортована. Для цього використовують різноманітні методи впорядкування, тобто сортування інформації.
Теоретична частина
Логічний тип
В мові C++ логічний тип (bool) характеризується двома значеннями: false (0) і true (1). На відміну від мови С++ в мові С логічний тип даних іменується Bool, але при включенні заголовочного файлу <stdbool.h> можна використовувати ключові слова bool, true, false.
В пам'яті комп'ютера змінна типу bool займає 1 байт. Логічні значення можна асоціювати зі значеннями типу int: значенню false відповідає нуль, значенню true відповідають всі інші числа.
В арифметичних і логічних виразах логічні значення перетворюються в цілі числа. Арифметичні та бітові логічні операції виконуються над перетвореними величинами. Якщо результат приводиться знову до логічного типу, то 0 перетворюється в false, а ненульове значення перетворюється в true.
Символьний тип
Значеннями змінних типу char є множина символів таблиці ASCII. Таблиця кодів ASCІІ містить 256 символів, кожний з яких має строго визначене місце і свій порядковий номер від 0 до 255. Код символу - це його порядковий номер у таблиці символів ASCІІ.
Всі символи, крім символів керування, є графічними. Вони на пристроях зображення відображаються, а в таблиці кодів ASCІІ мають графічне зображення.
Оскільки значенню типу char відводиться 8 бітів, то значення типу unsigned char має значення в діапазоні від 0 до 255, a signed char – від -128 до 127, але тільки величини від 0 до 127 мають символьний еквівалент. Чи є значення типу просто char знаковим чи беззнаковим, залежить від реалізації, але в будь-якому випадку коди друкованих символів завжди є додатніми.
Цілий тип
Типи short, іnt і long призначені для представлення цілих чисел.
Цілі типи можуть бути знаковими (sіgned) і беззнаковими (unsіgned). В знакових типах самий лівий біт використовується для зберігання знака числа (0 – плюс, 1 – мінус). Решта бітів містять числове значення. В беззнакових типах всі біти використаються для числового значення. За замовчуванням всі цілочисельні типи вважаються знаковими.
Тип
Розмір пам'яті
в байтах 16 (32)
Діапазон значень
[signed] short [int]
2
-215 .. 215-1 = -32768 .. 32767
unsigned short [int]
2
0 .. 216-1 = 0 .. 65535
[signed] int
2 (4)
-215 .. 215-1 (-231 .. 231-1)
unsigned [int]
2 (4)
0 .. 216-1 (0 .. 232-1)
[signed] long [int]
4
-231 .. 231-1 = -2 147 483 648 .. 2 147 483 647
unsigned long [int]
4
0 .. 232-1 = 0 .. 4 294 967 295
Дійсний тип
Дійсні константи записуються у двох формах – з фіксованою десятковою крапкою або в експонентному виді. В першому випадку крапка використовується для поділу цілої і дробової частин константи. Як ціла, так і дробова частини можуть бути відсутніми.
У мові С++ дійсні типи або типи з рухомою комою представляються трьома розмірами, що характеризують точність представлення дійсних чисел:
float – одиничної точності;
double - подвійної точності;
long double – розширеної точності (у деяких реалізаціях тип long double може бути відсутній)
Тип long double займає 10 байт (або 8 байт), в яких один розряд виділяється під знак, 15 – під порядок, інші 64 – під мантису. Записуються всі 64 розряди мантиси разом зі старшою одиницею.
Назва
типу
Іденти-фікатор
Діапазон значень
Внутрішній формат:
s–знак,e–експонента,m–мантиса
Значення числа
Розмір пам’яті в байтах
Дійсне одинарної точності
float
від 3.410-38
до 3.41038
1 біт 8 біт 23 біта
s
e
m
(-1)S1,m2e -127
4
Дійсне подвійної точності
double
від 1.710-308
до 1.710308
1 біт 11 біт 52 біта
s
e
m
(-1)S1,m2e –1023
8
Дійсне підвищеної точності
long double
від 3.410-4932
до 3.4104932
1 біт 15 біт 1біт 63 біта
s
e
1
m
(-1)S1,m2e -16383
10 (8)*
Рядок символів
Символьні константи (символьні літерали) можна представляти як:
клавіатурні: '1','s','Y' – записуються як символи в одинарних лапках;
кодові: '\n','\\','\?', які використовуються для представлення деяких керуючих символів та символів-розділювачів – записуються як escape-послідовності (вони починаються з символу зворотної косої риски).
Не дивлячись на свій зовнішній вигляд, це одиночні символи.
Назва
Кодові символьні літерали
Код
Новий рядок
\n
0A
Горизонтальна табуляція
\t
09
Забій
\b
08
Вертикальна табуляція
\v
0B
Повернення каретки
\r
0D
Прогін аркуша
\f
0C
Дзвінок
\a
07
Зворотня коса риска
\\
5C
Знак питання
\?
3F
Одиночні лапки
\'
27
Подвійні лапки
\"
22
3) кодові числові: '\0','\x5C','\124', які використовуються для представлення будь-яких символів – записуються у вигляді однієї, двох або трьох вісімкових цифр з символом зворотної косої риски ( \ ) перед ними або довільним шістнадцятковим числом з послідовністю \х перед ним. Послідовність вісімкових або шістнадцяткових цифр закінчується першим символом, який не є відповідно вісімковою або шістнадцятковою цифрою.
Десяткова
Вісімкова
Шістнадцяткова
Символ
7
'\7'
'\x7'
Дзвінок
48
'\60'
'\x30'
'0'
50
'\062'
'\x32'
'2'
95
'\137'
'\x005f'
'_'
Перерахування
Змінна, котра може приймати значення з деякого списку значень, називається змінною перерахуванням. Оголошення переліку задає тип змінної переліку і визначає список іменованих констант, що називається списком переліку. Імена елементів списку переліку задаються в фігурних дужках через кому.
Значенням кожного імені списку є деяке ціле число. Змінна типу переліку може приймати значення однієї з іменованих констант списку.
Кожен ідентифікатор іменує елемент переліку. Всі ідентифікатори в списку переліку повинні бути унікальними і повинні відрізнятись від всіх інших ідентифікаторів в тій самій області видимості, включаючи імена звичайних змінних та ідентифікатори з інших списків переліку.
У випадку відсутності константного виразу перший ідентифікатор набуває значення 0, наступний ідентифікатор - значення 1, наступний - 2 і т.д. Отже, пам'ять, що відводиться під змінну типу перелік - це пам'ять, необхідна для розміщення значення типу іnt.
Масив
Масив - це впорядкований скінченний набір даних одного типу, які зберігаються в послідовно розташованих комірках оперативної пам'яті і мають спільну назву. З оголошення масиву компілятор одержує інформацію про тип елементів масиву та їх кількість.
Для роботи з масивом його елементи індексуються (нумеруються), а доступ до них здійснюється за допомогою операції взяття індексу. В мові С++ індексація масивів починається з 0, тому елемент із індексом 1 насправді є другим елементом масиву, а індекс першого дорівнює 0. Індекс може бути цілим числом або цілим виразом. Якщо в якості індекса використовується вираз, то спочатку обчислюється вираз, щоб визначити конкретний елемент масиву з яким буде виконуватись робота.
Структура
На відміну від масиву, всі елементи якого однотипні, структура може містити елементи різних типів. В мові C++ структура є видом класу і має всі його властивості, але в багатьох випадках доситатньо використовувати структури так, як вони визначені в мові С.
Елементом структури може бути бітове поле, що забезпечує доступ до окремих бітів пам'яті. Поза структурами бітові поля використовувати не можна.
Бітові поля - це особливий вид полів структури. Вони використовуються для щільного упакування даних, наприклад, прапорців типу "так/ні". Найменьша по довжині комірка пам'яті, яку можна адресувати - 1 байт, а для збереження прапорця досить одного біта.
При описі бітового поля після імені через двокрапку вказується довжина поля в бітах, що задається цілим виразом або константою. Поле нульової довжини означає вирівнювання на границю наступного слова.
Об'єднання
Об'єднання дуже схожі на структури. Однак на відміну від структури об'єднання зберігає значення тільки одного елемента в кожний момент часу. Інакше кажучи, коли виконується операція присвоювання значення елементу об'єднання, то перезаписується будь-яке попереднє присвоювання.
Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найбільш довгого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити зайву пам'ять, що не використовується. Всі елементи об'єднання зберігаються в одній і тій cамій області пам'яті, починаючи з однієї адреси.
2.Алгоритм розв’язання задачі.
Рішення задачі проводимо за допомогою шаблону функції, що дає змогу працювати з усіма стандартними типами даних. В функції оголошуємо вказівник на змінну типу “unsigned char” і присвоюємо їй адресу змінної, яку необхідно прочитати. Побайтно зчитуємо дані з пам’яті і виводимо їх в шіснадцятковій системі численя, також виводимо десяткове значення змінної. В головній програмі оголошуємо необхідні змінні і виводимо результати роботи програми.
3. Система тестів
Завдання 1: Внутрішні формати базових типів
Визначити внутрішнє представлення в пам’яті комп’ютера даних базових типів. Розглянути основні прості (цілі, дійсні, символьні, логічні) типи даних:
bool b;
unsigned char ch2;
long i6;
float d1;
3.1.1. Логічний тип
Змінна типу bool займає в пам’яті комп’ютера 1 біт і коли змінна приймає значення відмінне від 0, то ВПК записується «01», а якщо 0, то ВПК 00.
Оскільки b = 15, то ВПК (b) – 01
3.1.2. Символьний тип
Змінна типу unsigned char займає в пам’яті комп’ютера 1 байт. ASCII код маленької літери u – 11710. Для отримання значення змінної ВПК, необхідно перевести це число до двійкової СЧ. 11710 = 0111 01012. Оскільки char займає 1 байт, то «перевертання» числа побайтно не впливає на його зміст. Отже,
ВПК (ch2) – 0111 0101 в двійковії СЧ, або 75 в шістнадцятковій СЧ.
3.1.3. Цілий тип
Змінна типу long займає в пам’яті комп’ютера 4 байти. Для того, щоб визначити внутрішнє представлення в пам’яті комп’ютера цього числа, його спочатку треба перевести у двійкову СЧ.
915210 =1010 0011 1100 0000 . Доповнимо це число зліва нулями до 4 байт (32 біт/32 розряди): 0000 0000 0000 0000 1010 0011 1100 0000.
Оскільки число від’ємне зробимо інверсію і додамо +1
0000 0000 0000 0000 1010 0011 1100 0000
1111 1111 1111 1111 0101 1100 0011 1111
+1
1111 1111 1111 1111 1011 1100 0100 0000
F F F F D C 4 0
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно, бо ВПК цілі числа зберігаються у зворотньому порядку розміщення байт числа:
Отже, ВПК (i6) – 0100 0000 1011 1100 1111 1111 1111 1111 у 2 СЧ, або 40 DC FF FF у 16 СЧ.
3.1.4. Дійсний тип
Переведем число у 10 та 2 СЧ:
float d1 = - 286.26e-11; -0,000000002862610
0,0000 0000 0000 0000 0000 0000 0000 1100 0100 1011 0111 0110 0100 0100 10112
Нормалізація: 1, 100 0100 1011 0111 0110 0100 *101D
Обчислюємо е: е = 127 – 29 = 9810=6216
Звідси е = 0110 0010;
Число від‘ємне, отже s = 1.
Мантиса m=100 0100 1011 0111 0110 0100
Запишемо число в вигляді таблиці:
s = 1 е = 0110 0010 m=100 0100 1011 0111 0110 0100
S
e
m
1
0110 0010
100 0100 1011 0111 0110 0100
Переведемо шіснадцяткову систему числення: B1 44 B7 64
Запишемо в оберненому порядку байт: 64 B7 44 B1
Результат: 64 B7 44 B1
Завдання 2: Внутрішні формати похідних типів
3.2.1. Рядок символів
Визначити представлення в пам’яті комп’ютера рядків символів.
Розглянемо, як представляється в пам’яті комп’ютера рядок символів.
char *string10 = "fsggg4\x11 4vv\vnn n\"df""\\\?6\6";
«Розберемо» цей рядок:
/
Х
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string10[X]
f
s
g
g
g
4
11
32
4
v
v
n
n
32
n
“
d
f
У 16 СЧ
66
73
67
67
67
34
11
20
34
76
76
0B
6E
6E
20
6E
22
64
66
Х
19
20
21
22
String10[X]
/
?
6
68
У 16 СЧ
5C
3F
36
06
Виконуємо наступні переприсвоюння:
string10 [00] = символ, що відповідає 03 цифрі номера мобільного телефона = ‘0’;
string10 [02] = символ, що відповідає 04 цифрі номера мобільного телефона = ‘9’;
string10 [04] = символ, що відповідає 05 цифрі номера мобільного телефона = ‘5’;
string10 [06] = символ, що відповідає 06 цифрі номера мобільного телефона = ‘7’;
string10 [08] = символ, що відповідає 07 цифрі номера мобільного телефона = ‘7’;
string10 [10] = символ, що відповідає 08 цифрі номера мобільного телефона = ‘5’;
string10 [12] = символ, що відповідає 09 цифрі номера мобільного телефона = ‘0’;
string10 [14] = символ, що відповідає 10 цифрі номера мобільного телефона = ‘5’;
Х
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string10[X]
0
s
9
g
5
4
7
32
7
v
5
0
n
5
n
“
d
f
У 16 СЧ
30
73
39
67
35
34
07
20
37
76
35
0B
30
6E
35
6E
22
64
66
Х
19
20
21
22
String10[X]
/
?
6
68
У 16 СЧ
5C
3F
36
06
В результаті рядок символів набуде такого вигляду:
char *string10 = "0s9g54\7 7v5\v0n5n\"df""\\\?6\
Переведем у 16 СЧ (значення рядка):
ВПК string10: 30 73 39 67 35 34 07 20 37 76 35 0B 30 6E 35 6E 22 64 66 5C 3F 36 06 00
3.2.2. Представлення перерахувань
Визначити представлення в пам’яті комп’ютера перерахувань.
Розглянемо, як представляється в пам’яті перелік
enum color4 {
BLUE, // 0, бо не визначено (немає присвоєння значення змінній BLUE)
GREEN, // 1, (оскільки невизначено, то GREEN = BLUE + 1)
CYAN = 9, // 9, бо вказано (змінній CYAN присвоєно значення 9)
RED, // 10, (оскільки невизначено, то RED = CYAN + 1)
BROWN, // 11, (оскільки невизначено, то BROWN = RED + 1)
GRAY, // 12, (оскільки невизначено, то GRAY = BROWN + 1)
YELLOW = -1, //-1, бо вказано (змінній YELLOW присвоєно значення -1)
WHІTE, // 0, (оскільки невизначено, то WHITE = YELLOW + 1)
MAGENTA, // 1, (оскільки невизначено, то WHITE = MAGENTA + 1)
LІGHTGRAY, // 2, (оскільки невизначено, то LIGHTGRAY = MAGENTA + 1)
DARKGRAY = 2, // 2, бо вказано (змінній DARKGRAY присвоєно значення 2)
BLACK , // 3, (оскільки невизначено, то BLACK = DARKGRAY + 1)
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY;
ВПК c1: 09 00 00 00
ВПК c2: 0B 00 00 00
ВПК c3: 02 00 00 00
3.2.3. Представлення масивів
Визначити представлення в пам’яті комп’ютера масивів.
Розглянемо, як представляється в пам’яті наступний масив:
unsigned short array21[][3][2] = {{{}, 15,2,8,5}, {}, 34}
В нас є 3 таблиці по 3 рядки і 2 стовпці.
{} - означає що в першій таблиці перший рядок пустий і запис починається з другого рядка
В 2 і 3 рядки 1 таблиці записуєм 15,2,8,5.
Другий елемент {}, означає, що 2 таблиця повністю заповнюється нулями , а 34 записуєм в 1 рядок 1 стовпчика 3 таблиці.
array21[0][0][0] = 0; array21[0][0][1] = 0;
array21[0][1][0] = 15;array21[0][1][1] = 2;
array21[0][2][0] = 8; array21[0][2][1] = 5
array21[1][0][0] = 0; array21[1][0][1] = 0;
array21[1][1][0] = 0; array21[1][1][1] = 0;
array21[1][2][0] = 0; array21[1][2][1] = 0;
array0[2][0][0] = 34; array0[2][0][1] = 0;
array0[2][1][0] = 0; array0[2][1][1] = 0;
array0[2][2][0] = 0; array0[2][2][1] = 0;
Виконуєм наступні переприсвоюння:
1-ий елемент масиву = (01 цифра номера мобільного телефона) * (на день народження) = 0;
2-ий елемент масиву = (02 цифра номера мобільного телефона) * (на день народження) = 130;
3-ий елемент масиву = (03 цифра номера мобільного телефона) * (на день народження) = 0;
4-ий елемент масиву = (04 цифра номера мобільного телефона) * (на день народження) = 234;
5-ий елемент масиву = (05 цифра номера мобільного телефона) * (на день народження) = 130;
6-ий елемент масиву = (06 цифра номера мобільного телефона) * (на день народження) = 182;
7-ий елемент масиву = (07 цифра номера мобільного телефона) * (на день народження) = 182;
8-ий елемент масиву = (08 цифра номера мобільного телефона) * (на день народження) = 130;
9-ий елемент масиву = (09 цифра номера мобільного телефона) * (на день народження) = 0;
10-й елемент масиву = (10 цифра номера мобільного телефона) * (на день народження) = 130;
Масив після присвоювання:
array21[0][0][0] = 0; array21[0][0][1] = 130;
ВПК:00 00 ВПК:82 00
array21[0][1][0] = 0; array21[0][1][1] = 234;
ВПК:00 00 ВПК:EA 00
array21[0][2][0] = 130;array21[0][2][1] = 182;
ВПК:82 00 ВПК:B6 00
array21[1][0][0] = 130; array21[1][0][1] = 0;
ВПК:82 00 ВПК:00 00
array21[1][1][0] = 0; array21[1][1][1] = 130;
ВПК:00 00 ВПК:82 00
array21[1][2][0] = 0; array21[1][2][1] = 0;
ВПК:00 00 ВПК:00 00
array21[2][0][0] = 34;array21[2][0][1] = 0;
ВПК:22 00 ВПК:00 00
array21[2][1][0] = 0; array21[2][1][1] = 0;
ВПК:00 00 ВПК:00 00
array21[2][2][0] = 0; array21[2][2][1] = 0;
ВПК:00 00 ВПК:00 00
Отже, ВПК масив array21 буде:
00 00 82 00 EA 00 82 00 B6 00 05 00 B6 00 82 00 82 00 00 00 00 00 00 00 22 00 00 00 00 00 00 00 00 00 00 00
3.2.4 Представлення структур.
Розглянемо, як представляється в пам’яті комп’ютера структура.
struct str10 {
short :10;
char c[8];
long :12;
short b:8;
unsigned e:3;
float a;
char f;
unsigned long d;
}str;
str.a = 26.286;
str.b = 76384;
str.c[0] = 'K';
str.c[1] = 'u';
str.c[2] = 't';
str.c[3] = 's';
str.c[4] = 0;
str.d = 213920;
str.e = 10296;
str.f = 5;
Визначимо представлення в пам'яті комп’ютера окремо кожного поля:
short :10 - не використовується;
Враховуючи вирівнювання в середині слова:
ВПК: СС СС
char c[8] – в пам’яті комп’ютера зберігається в наступному вигляді(не ініціалізовані елементи по замовчуванню в пам’ті представляються як СС):
ВПК: 4B 75 74 73 00 CC CC CC
long :12- не використовується;
Враховуючи вирівнювання до числа кратного довжині наступного поля:
ВПК: CC CC CC CC
short b:8 – під змінну виділено 8 біт – 1байт;
7638410 = 12A6016
Від числа 12A6016 буде братись лише молодший байт 6016
ВПК: 60
unsigned e:3 – під змінну 3 біта;
1029610 = 283816
Відповідно в пам’ять запишеться 0002
Враховуючи вирівнювання:
ВПК: CC CC CC C8
float a;
26.286 10 = 1A.49374B 16 = 0001 1010.0100 1001 0011 0111 0100 10112
Нормалізація: 0001. 1010 0100 1001 0011 0111 0100 10112 *104
Мантиса: m=1010 0100 1001 0011 0111 010
Зміщений порядок: е = 12710 + 410 = 131 10 = 83 16 = 1000 0011 2
Знак: s=0
Зборка за схемою:
1біт
8 біт
23 біта
s
e
m
0
1000 0011
1010 0100 1001 0011 0111 010
0100 0001 1101 0010 0100 1001 1011 1010
4 1 D 2 4 9 B A
ВПК: BA 49 D2 41
char f;
f = 5 10 = 0516
Так як char має один байт
тому ВПК : 05
unsigned long d;
21392010 = 343A016
ВПК: A0 43 03 00
Елементи в пам'яті зберігаються в тому ж порядку, в якому вони були
представлені в описі структур.
Розглянемо структуру в шістнадцятковому коді:
CC CC 4B 75 74 73 00 CC