Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
До курсової роботи
з дисципліни: “Програмування. Частина III. Структури даних та алгоритми ”
"Представлення в пам’яті комп’ютера
статичних даних"
Вибір варіантів індивідуального завдання:
Завдання 1: № варіанта = ((8) % 5 ;(4) % 6) = (3;4)
Завдання 2.1: № варіанта = (((4*31)%1)*8+31)%30=3
Завдання 2.2: № варіанта = ((4+31)*(1+8))%30=15
Завдання 2.3: № варіанта = (31 * 10 + 1 * 8) % 30 = 18
Завдання 2.4: № варіанта = (4*3*1+(8%3)*31)%30=14
Завдання 2.5: № варіанта = (4+8+1*31+4*8)%30=15
Завдання на курсову роботуЗавдання 1
Визначити внутрішнє представлення в пам’яті комп’ютера даних базових типів. Розглянути основні прості (цілі, дійсні, символьні, логічні) типи даних:
bool b = ( 4 * 5 ) % 10 * 8 = 20 % 10 * 8 = 0
wchar_t ch4 ='у';
unsigned i3 = 4 * 215;
double d2 = 32.4е + 8;
Завдання 2.1
Визначити внутрішнє представлення в пам’яті комп’ютера даних похідних типів.
char *string3 = "efg\\""""\x22\2!34\4\?545\\\\\"\'f\\df";
Виконати наступні переприсвоювання:
string3 [0] = '6'
string3 [2] = '0'
string3 [4] = '7'
string3 [6] = '1'
string3 [8] = '6'
string3 [10] ='8'
string3 [12] = '5'
string3 [14] = '9'
Завдання 2.2.
Визначити представлення в пам’яті комп’ютера переліків.
enum color15 {
BLUE,
GREEN,
CYAN,
RED,
BROWN = 3,
GRAY,
YELLOW,
WHІTE = 2,
MAGENTA,
LІGHTGRAY,
DARKGRAY,
BLACK
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY;
Завдання 2.3.Визначити представлення в пам’яті комп’ютера масивів.
wchar_t array18[][3][2] = {{7,6,}, {234,56}}
Виконати наступні переприсвоюння:
1 -ий елемент масиву =0; //0 * 4 = 0;
2 -ий елемент масиву =36; //9 * 4 = 36;
3 -ий елемент масиву =24; //6 * 4 = 24;
4 -ий елемент масиву =0; //0 * 4 = 0;
5 -ий елемент масиву =28; //7 * 4 = 28;
6 -ий елемент масиву =4; //1 * 4 = 4;
7 -ий елемент масиву =24; //6 * 4 = 24;
8 -ий елемент масиву =36; //8 * 4 = 36;
9 -ий елемент масиву =20; //5 * 4 = 20;
10 -ий елемент масиву =36; //9 * 4 = 36;
Завдання 2.4.
Визначити представлення в пам’яті комп’ютера структур.
struct str14 {
unsigned e:3;
float a;
unsigned short b:4;
unsigned short :0;
unsigned long d;
char c[6];
signed :5;
long :2;
char f;
}str;
Виконати надання значень елементам структури :
str.a = 4.36;
str.b = 31 * 1 * 124;
str.c[0] = 'P';
str.c[1] = 'e';
str.c[2] = 'l';
str.c[3] = 'e';
str.c[4] = 'n';
str.d = 764 * 31 * 7;
str.e = 4 * 8 * 36;
str.f = '9';
Завдання 2.5.
Визначити представлення в пам’яті комп’ютера об'єднань.
union un15 {
struct {
float f[2];
wchar_t a[10];
};
struct {
float e;
short c;
};
} un;
Виконати надання значень елементам об'єднання :
un.e = 1 * 325 + 1994 * 4;
un.c = 4 * (8 + 31) * 100;
un.a[0] = '1';
un.a[1] = '6';
un.a[2] = '8';
un.a[3] = '5';
un.a[4] = '9';
Зміст
Завдання на курсову роботу………………………………. ст. 2-3
Вступ …………………….…………………….……………..ст.5
Теоретична частина …………………………………… cт. 6-7
Алгоритм розв’язання задачі………………………………ст.8
Система тестів …………………….……………………….ст. 9-19
Результати виконання програм………………………..…ст.20-22
Висновки…………………….…………………….……….ст. 23
Список літератури…………………….…………………….ст. 24
Додатки…………………….…………………….…………ст .25-29
Вступ
Дана курсова робота полягає у вивченні представлення в мові програмування С++ різних типів даних, як простих (логічний, символьний, дійсні, цілі), так і похідних(структури, масиви, перерахування, об’єднання) .
Знати про структури даних важливо, оскільки від правильного вибору структур, на яких буде реалізуватися програмний продукт, залежить ефективність роботи програми. В цій роботі й буде продемонстровано, як саме різні типи даних зберігаються в комп’ютері.
1.Теоретична частина
Базові типи даних
Логічний тип даних
В мові C++ логічний тип (bool) характеризується двома значеннями: false (0) і true (1). В пам'яті комп'ютера змінна типу bool займає 1 байт. Логічні значення можна асоціювати зі значеннями типу int: значенню false відповідає нуль, значенню true відповідають всі інші числа.В арифметичних і логічних виразах логічні значення перетворюються в цілі числа. Арифметичні та бітові логічні операції виконуються над перетвореними величинами. Якщо результат приводиться знову до логічного типу, то 0 перетворюється в false, а ненульове значення перетворюється в true.
Цілочисельні типи даних
Згідно зі стандартом мови С++ розмір типу int відповідає розміру машинного слова, властивому програмно-апаратній платформі конкретної системи програмування.
До типу int можна застосувати модифікатори long (довге ціле) та short (коротке ціле). Модифікатор типу long вказує, що дане буде займати не менше як 4 байти (у більшості систем програмування тип long має розмір саме 4 байти). Модифікатор short вказує, що дане не повинно перевищувати розмір типу int (у більшості реалізацій тип short займає 2 байти).
Тип int та його модифікації є знаковими типами. Це означає, що один біт (здебільшого найстарший) двійкового коду числа займає знак. Прийнято, що знак плюс позначається нулем, а знак мінус – одиницею. Від'ємні цілі числа у більшості комп'ютерних реалізацій зберігаються в доповнювальному коді.
Якщо певні дані набувають тільки додатних значень, то можна вдвічі збільшити діапазон їх додатних значень, оголосивши такі дані з модифікатором unsigned (беззнаковий). B беззнакових даних біт знака розглядається як звичайний числовий біт. Модифікатор unsigned можна застосовувати і до даних з типами long або short.
Внутрішнє представлення змінної цілого типу — ціле число у двійковому коді. Згідно формату IEEE всі додатні цілі числа зберігаються в пам'яті комп'ютера в прямому коді, а всі від'ємні – в доповняльному коді. Цілі числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
Дійсні типи даних
Для збереження й опрацювання дійсних чисел (тобто чисел, що складаються з цілої та дробової частин) мова С++ підтримує три дійсних типи: float, double і long double.
Старший біт числа займає знак мантиси, за ним записується двійковий порядок числа, а потім - сама мантиса. Мантиса зберігається в нормалізованій формі, тобто старшою цифрою мантиси завжди є двійкова одиниця (нормалізація мантис виконується шляхом зсуву їх уліво з відповідним зменшенням значення порядку). Розміри мантиси і порядку для трьох дійсних типів є різними, вони визначають точність чисел і діапазон їх значень.
В пам'яті комп'ютера змінна типу float займає 4 байти, в яких один біт виділяється під знак, 8 – під порядок, 23 – під мантису.
Тип double займає 8 байт, у яких один розряд виділяється під знак, 11 – під порядок, 52 – під мантису. Насправді в мантисі 53 розряди, але старший завжди дорівнює одиниці і тому не зберігається.
Тип long double займає 10 байт (або 8 байт), в яких один розряд виділяється під знак, 15 – під порядок, інші 64 – під мантису. Записуються всі 64 розряди мантиси разом зі старшою одиницею.
Оскільки порядок може бути додатній і від'ємний, у двійковому коді він зберігається в зміщеному виді: до нього додається константа, яка рівна абсолютній величині максимального по модулю від'ємного порядку. У випадку типу float вона дорівнює 127, у випадку double – 1023, long double – 16383. Таким чином, максимальний по модулю від'ємний порядок представляється нульовим кодом.
Дійсні числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
Похідні типи даних
Тип даних «Рядок»
По своїй суті тип рядок є ідентичним типу даних масив. Елементи рядка зберігаються в пам’яті комп’ютера так само, як і елементи масиву. Відмінністю є тільки те, що базовим типом для рядка є лише тип char[], та обмеження кількості елементів до 255.
Тип даних «Перерахування» («Перелік»)
Змінна, котра може приймати значення з деякого списку значень, називається змінною перелічуваного типу або переліком. Оголошення переліку задає тип змінної переліку і визначає список іменованих констант, що називається списком переліку. Імена елементів списку переліку задаються в фігурних дужках через кому.
Значенням кожного імені списку є деяке ціле число. Змінна типу переліку може приймати значення однієї з іменованих констант списку.
Кожен ідентифікатор іменує елемент переліку. Всі ідентифікатори в списку переліку повинні бути унікальними і повинні відрізнятись від всіх інших ідентифікаторів в тій самій області видимості, включаючи імена звичайних змінних та ідентифікатори з інших списків переліку. У випадку відсутності константного виразу перший ідентифікатор набуває значення 0, наступний ідентифікатор - значення 1, наступний - 2 і т.д. Отже, пам'ять, що відводиться під змінну типу перелік - це пам'ять, необхідна для розміщення значення типу іnt.
Ідентифікатор, зв'язаний з константним виразом, приймає значення, що задається цим константним виразом. Константний вираз повинен мати тип іnt і може бути як додатнім, так і від’ємним. Константні вирази можуть містити однакові значення. Наступний ідентифікатор в списку отримує значення, рівне константному виразу плюс 1, якщо цей ідентифікатор не має свого константного виразу.
Тип даних «Масив»
Масив - це однорідна складена структура даних статичної структури. Кожен компонент масиву характеризується своїм індексом. Допустимими типами індексів є всі порядкові типи. Для доступу до елементів масиву необхідно вказати ідентифікатор масиву з одним чи кількома індексами в дужках. Він зберігається як неперервна послідовність змінних того типу, якого оголошені елементи масиву.
Розмір пам'яті, що відводиться для зберігання масиву, обчислюється як добутку кількості елементів на розмір елемента.
Елементи масиву з найменшим індексом зберігаються по найменшій адресі пам’яті. Багатовимірні масиви зберігаються так, що найбільш правий індекс збільшується першим.
Тип даних «Структура»
На відміну від масиву, всі елементи якого однотипні, структура може містити елементи різних типів. В мові C++ структура є видом класу і має всі його властивості, але в багатьох випадках достатньо використовувати структури так, як вони визначені в мові С:
struct [ім'я_типу] {
тип_1 елемент _1:
тип_2 елемент _2;
тип_n елемент _n;
} [ список_оголошень ];
Елементи структури називаються полями структури і можуть мати будь-які типи, крім типу цієї ж структури, але можуть бути вказівниками на неї.
Для змінних одного й того ж структурного типу визначена операція присвоювання, при цьому відбувається поелементне копіювання. Структуру можна передавати в функцію і повертати як значення функції. Доступ до полів структури виконується за допомогою операцій вибору: "." (крапка) - при звертанні до поля через ім'я структури і "->" - при звертанні через вказівник. У пам'яті комп’ютера під кожний елемент структури виділяється визначений відповідно до типу цього елемента об’єм пам'яті. Елементи в пам'яті зберігаються в тому ж порядку, в якому вони були представлені в описі структури.
Розмір змінної структурного типу не можна обчислити просто як суму його елементів, тому що змінні певних типів мають вирівнюватись в пам'яті комп’ютера по деяким залежним від реалізації границям.
Тип даних «Об’єднання»
Об’єднання дуже схожі на структури. Однак на відміну від структури об'єднання зберігає значення тільки одного елемента в кожний момент часу. Інакше кажучи, коли виконується операція присвоювання значення елементу об'єднання, то перезаписується будь-яке попереднє присвоювання.
Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найбільш довгого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити зайву пам'ять, що не використовується. Всі елементи об'єднання зберігаються в одній і тій cамій області пам'яті, починаючи з однієї адреси.
2.Алгоритм розв’язання задачі.
Щоб розвязати дані задачі потрібно
Оголосити та ініціалізувати дані типи згідно завдання;
Потрібно використати вказівних типу unsigned char на досліджувану змінну.
unsigned char _var[sizeof(var)];
for(int i=0; i<sizeof(var); i++)
{
var[i] = *((char*)&var + i);
printf("%02Lx ", _var [i]);
}
3. Система тестів
Завдання 1: Внутрішні формати базових типів
3.1.1. Логічний тип
bool b = ( 4 * 5 ) % 10 * 8 ; // 0
Змінна типу bool займає в пам’яті комп’ютера 1 байт і коли змінна приймає значення відмінне від 0, то ВПК записується «1», а якщо 0, то ВПК 0.
ВПК: 0016
3.1.2. Символьний тип
wchar_t ch4= ‘y’;Розглянемо, як представляється у пам’яті комп’ютера змінна wchar_t ch4 = ‘y’.В пам'яті комп'ютера змінна типу unsigned char займає 2 байти.За системою ASCII символ 'y' має порядковий номер 79.ch4 = 7916 ВПК: 79 0016
3.1.3. Цілий тип
unsigned i3 = 4 * 215;
i1= 86010 = 35C16;
unsigned - займає 4 байти отже
0000 0000 0000 0000 0000 0011 0101 11002
0 0 0 0 0 3 5 C
Представляєм в пам'яті комп'ютера:
ВПК: 5C 03 00 0016
3.1.4. Дійсний тип
double d2 = 32.4e+8;
32.4e+8 = 3240000000.010
ціла частина 324000000010=C11E7A0016 = 110000010001111001111010000000002
дробова частина 0.010 = 0.000016
Необхідно визначити значення m (мантиса), s(знак) та e(експонента).
s = 0, бо число додатнє.
11000001000111100111101000000000,02
нормалізація.
1.1000001000111100111101000000000*1011111
double займає ВПК 8 байт (64 біти/64 двійкових розряди)
З них 11 біт виділяється під експоненту, 1 біт під знак числа і решта 52 під мантису (у double числі мантиса береться з початковою одиницею).
Експонента:
e = 1023 + 31. е = 105410 = 41E16 = 100 0001 11102
Нам необхідно визначити перші 52 двійкових розрядів мантиси:
1000 0010 0011 1100 1111 0100 0000 0000 0000 0000 0000 0000 00002
Зборка за схемою:
S
E
M
0
100 0001 1110
1000 0010 0011 1100 1111 0100 0000 0000 0000 0000 0000 0000 0000
0100 0001 1110 1000 0010 0011 1100 1111 0100 0000 0000 0000 0000 0000 0000 0000 2 =
= 41 E8 23 CF 40 00 00 0016
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно, бо ВПК double числа зберігаються у зворотньому порядку розміщення байт числа:
Отже, ВПК (d2) : 00 00 00 40 CF 23 E8 4116
Завдання 2: Внутрішні формати похідних типів
3.2.1. Рядок символів
char *string3 = "efg\\""""\x22\2!34\4\?545\\\\\"\'f\\df";
'e'
‘f’
‘g’
‘\’
‘"’
‘☺’
‘!’
‘3’
65
66
67
5C
22
02
21
33
‘4’
‘♦’
‘?’
‘5’
‘4’
‘5’
‘\’
'\'
'"'
'''
'f'
34
04
3F
35
34
35
5C
5C
22
27
66
'\'
'd'
'f'
\0
5C
64
66
00
ВПК: 65 66 67 5C 22 02 21 33 34 04 3F 35 34 35 5C 5C 22 27 66 5C 64 66 00
Рядок символів після переприсвоювання:
‘6’
‘f’
‘0’
‘\’
'7’
‘☺’
‘1’
‘3’
‘6’
36
66
30
5C
37
02
31
33
36
‘♦’
‘8’
‘5’
‘5’
‘5’
‘9’
‘\’
'"'
'''
'f'
04
38
35
35
35
39
5C
22
27
66
'\'
'd'
'f'
\0
5C
64
66
00
ВПК: 36 66 30 5С 37 02 31 33 36 04 38 35 35 35 39 5С 22 27 66 5С 64 66 00
3.2.2. Перерахування
enum color15 {
BLUE, // 0, бо не визначено (немає присвоєння значення змінній BLUE)
GREEN, //( 1 оскільки невизначено, то GREEN = BLUE + 1)
CYAN, // (2 оскільки невизначено, то CYAN = GREEN + 1)
RED, // ( 3 оскільки невизначено, то RED = CYAN+ 1)
BROWN = 3, //( 3 оскільки визначено, то BROWN = 3)
GRAY, //(4 оскільки невизначено, то GRAY = BROWN + 1)
YELLOW, //(5 оскільки невизначено, то YELLOW= GRAY + 1)
WHІTE = 2, //(2 оскільки визначено, то WHITE= 2)
MAGENTA, //(3 оскільки невизначено, то MAGNETA = WHITE + 1)
LІGHTGRAY, //(4 оскільки невизначено, то LІGHTGRAY = MAGENTA + 1)
DARKGRAY, //(5 оскільки невизначено, то DARKGRAY = LІGHTGRAY + 1)
BLACK //(6 оскільки невизначено, то BLACK = DARKGRAY + 1)
} c1= CYAN = 2;
c2= BROWN = 3;
c3= DARKGRAY= 5;
CYAN=210=0000 0000 0000 0000 0000 0000 0000 00102;
0 0 0 0 0 0 0 2
ВПК: 02 00 00 0016;
BROWN=310=0000 0000 0000 0000 0000 0000 0000 00112;
0 0 0 0 0 0 0 3
ВПК:03 00 00 0016;
DARKGRAY=510=0000 0000 0000 0000 0000 0000 0000 0101;
0 0 0 0 0 0 0 5
ВПК: 05 00 00 0016
ВПК: 02 00 00 0016
03 00 00 0016
05 00 00 0016
3.2.3. Масив
wchar_t array18[][3][2] = {{7,6,}, {234,56}}
Розмір масиву дорівнює [2] [3] [2] через те що в головних лапках знаходяться пара другорядних.
234
56
0
0
0
0
7
6
0
0
0
0
Його ще можна записати у такому вигляді
{{{{7},{6}},{{0},{0}},{{0},{0}}},{{{234},{56}},{{0},{0}},{{0},{0}}}}
1-ий елемент масиву =0; //0 * 4 = 0;
2-ий елемент масиву =36; //9 * 4 = 36;
3-ий елемент масиву =24; //6 * 4 = 24;
4-ий елемент масиву =0; //0 * 4 = 0;
5-ий елемент масиву =28; //7 * 4 = 28;
6-ий елемент масиву =4; //1 * 4 = 4;
7-ий елемент масиву =24; //6 * 4 = 24;
8-ий елемент масиву =36; //8 * 4 = 36;
9-ий елемент масиву =20; //5 * 4 = 20;
10-ий елемент масиву =36 //9 * 4 = 36;
В результаті масив набуде такого вигляду:
24
36
20
36
0
0
{{{{0},{36}},{{24},{0}},{{28},{4}}},{{{24},{36}},{{20},{36}},{{0},{0}}}}
0
36
24
0
28
4
Переводим у 16-ву систему числення:
010=> 016, 3610=> 2416, 2410=> 1816, 010=>016, 2810=> 1C16, 410=> 416, 2410=>1816,
3610=> 2416, 2010=> 1416, 3610=> 2416, 010=> 016, 010=> 016;
18
24
14
24
0
0
0
24
18
0
1C
4
Кожен елемент масиву – типу wchar_t, розмір якого – 2 байти. Отже разом наш масив займатиме 2*3*2 (всі розмірності)*2 = 24 байт
ВПК: 00 00 24 00 18 00 00 00 1C 00 04 00 18 00 24 00 14 00 24 00 00 00 00 0016
3.2.4. Структура
struct str14 {
unsigned e:3; //3 біти ВПК unsigned 4 байти
float a; // ВПК float дорівнює 4 байти
unsigned short b:4; // 4 біти ВПК unsigned short = 2 байти
unsigned short :0; //4+0 біти ВПК unsigned short = 2 байт
unsigned long d; // 4 байти
char c[6]; // ВПК char 1 байт 1*6=6
signed :5; //5 біт ВПК signed = 4 байти
long :2; //2 біти ВПК long = 4 байти
char f; //ВПК char = 1 байт
}str; //31 байти
4+4+2+2+4+6+4+4+1=31 не ділиться на найбільший тип float = 4 байт, тому доповнюєм до 32 байт
Виконати надання значень елементам структури :
str.a = 4.36;
str.b = 31 * 1 * 124;
str.c[0] = 'P';
str.c[1] = 'e';
str.c[2] = 'l';
str.c[3] = 'e';
str.c[4] = 'n';
str.d = 764 * 31 * 7;
str.e = 4 * 8 * 36;
str.f = '9';
На даному етапі ВПК структури заповнене 32-ма однаковими байтами СС, оскільки вона ще пуста.
ВПК str: CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
Представлення структури str в пам’яті комп’ютера:
str a = 4.36
float a = 4.36
Переведем 4.36 в шістнадцяткову і двійкову системи числення
Ціла частина числа 410 = 416 = 01002
Дробова частина числа 0.3610 = 5C28F516 = 0101110000101000111101012
Тип float займає ВПК 4 байт (32 біт)
З них 8 біт виділяється під експоненту, 1 біт під знак числа і решта 23 під мантису.
Необхідно визначити значення m (мантиса), s(знак) та e(експонента).
s = 0, бо число додатне.
0100,0101 1100 0010 1000 11112
Нормалізуєм
1,0001 0111 0000 1010 0011 110 101 *100010
1
0001 0111 0000 1010 0011 111
Знайдем експоненту :
е=12710 + 210 = 12910 = 8116 = 1000 00012
Знайдем мантису:
m = 0001 0111 0000 1010 0011 1112
Зборка за схемою
1біт
8 біт
23 біта
s
e
m
0
1000 0001
0001 0111 0000 1010 0011 111
0100 0000 1000 1011 1000 0101 0001 11112 =40 8B 85 1F16
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно, бо ВПК числа типу float зберігаються у зворотньому порядку розміщення байт числа.
ВПК: 1F 85 8B 4016
str b = 31*1*124=3844
unsigned short b:4=3844
Переводимо число 3844 в шістнадцяткову і двійкову системи числення
384410 = F04=1111 0000 01002
берем 4 молодших біти = 01002
Тип unsigned short займає 2 байти (16 біт)
Змінна b до присвоєння: 1100 1100 2 (СС СС16)
Змінна b після присвоєння: 1100 01002 (CC C416)
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно
ВПК: C4 CC16
str.e = 4 * 8 * 36= 1152
unsigned e:3 = 1152
Переводимо число 1152 в шістнадцяткову і двійкову системи числення
115210 = 48016 = 100100000002
беремо 3 молодших біти = 0002
Тип unsigned займає ВПК 4 байт (32 біт)
Змінна e до присвоєння: 1100 1100 1100 1100 2 (СС СС CC CC16)
Змінна e після присвоєння: 1100 1100 1100 10002 (СС СС CC C816)
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно
ВПК = C8 CC CC CC16
str.d = 764 * 31 * 7= 165788
Переводимо 165788 у шістнадцяткову і двійкову системи числення
unsigned long d = 1657882 = 2879C16 =1010000111100111002
Тип unsigned long займає ВПК 4 байт (32 біт)
0000 0000 0000 0010 1000 0111 1001 11002 = 00 02 87 9C16
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно
ВПК: 9C 87 02 0016
str.f = '9'
char f = '9'
ASCII код цифри 9 - це 3916 .Оскільки тип char, як правило, займає 1 байт пам'яті, це означає що змінна f буде мати значення 3916.
char c[6]
Переводимо у ASCII таблиці
str.c[0] = 'P'= 5016
str.c[1] = 'e'= 6516
str.c[2] = 'l'= 6C16
str.c[3] = 'e'= 6516
str.c[4] = 'n'= 6E16
На даному етапі ВПК структури заповнене 36-ма однаковими байтами СС, оскільки вона ще пуста.ВПК str: CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
Після виконання операції
str a = 4.36 = 1F 85 8B 4016
ВПК str: CC CC CC CC 1F 85 8B 40 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
Після виконання операції
str b = 31*1*124= 3844= C4 CC16
ВПК str: CC CC CC CC 1F 85 8B 40 C4 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
Після виконання операції
e:3 = 1152 = C8 CC CC CC16
ВПК str:C8 CC CC CC 1F 85 8B 40 C4 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
Після виконання операції
str d= 165788 = 9C 87 02 0016
ВПК str: C8 CC CC CC 1F 85 8B 40 C4 CC CC CC 9C 87 02 00 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
Після виконання операції
str.f = '9'= 3916
ВПК str: C8 CC CC CC 1F 85 8B 40 C4 CC CC CC 9C 87 02 00 CC CC CC CC CC CC CC CC CC CC CC CC 39 CC CC CC
Після виконання операції
str.c[0] = 'P'= 5016
str.c[1] = 'e'= 6516
str.c[2] = 'l'= 6C16
str.c[3] = 'e'= 6516
str.c[4] = 'n'= 6E16
ВПК str: C8 CC CC CC 1F 85 8B 40 C4 CC CC CC 9C 87 02 00 50 65 6C 65 6E CC CC CC CC CC CC CC 39 CC CC CC
отже кінцевий запис ВПК
ВПК str: C8 CC CC CC 1F 85 8B 40 C4 CC CC CC 9C 87 02 00 50 65 6C 65 6E CC CC CC CC CC CC CC 39 CC CC CC
3.2.5. Об'єднання
Визначити представлення в пам’яті комп’ютера об'єднань.
union un15 {
struct {
float f[2]; //4*2=8
wchar_t a[10]; // 2*10=20
};28
struct {
float e; //4
short c; //2
}; //6
} un;
28 ділиться на 4 найбільший тип в структурі заданій float = 4 байти отже лишаєм без доповнення
Виконати надання значень елементам об'єднання :
un.e = 1 * 325 + 1994 * 4;
un.c = 4 * (8 + 31) * 100;
un.a[0] = '1';
un.a[1] = '6';
un.a[2] = '8';
un.a[3] = '5';
un.a[4] = '9';
float e
un.e = 325+7976=8301
float e = 830110 = 206D16=00100000011011012
Тип float займає ВПК 4 байт (32 біт)
З них 8 біт виділяється під експоненту, 1 біт під знак числа і решта 23 під мантису.
Необхідно визначити значення m (мантиса), s(знак) та e(експонента).
s = 0, бо число додатне.
Нормалізуємо
1.0000 0011 0110 1000 0000 000 * 101101
Експонента
е = 12710 + 1310 = 14010 = 8C16 = 1000 11002
0000 0011 0110 1000 0000 000
s
E
m
0
1000 1100
0000 0011 0110 1000 0000 000
m = 0100 0110 0000 0001 1011 0100 0000 0000 2=
= 46 01 B4 0016
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно, бо ВПК числа зберігаються у зворотньому порядку розміщення байт числа:
ВПК: 00 B4 01 4616
00 B4 01 4616
short c
un.c =4 * (8 + 31) * 100=1560010=3CF016 = 00111100111100002
Тип short займає 2 байта тому :
3C F016
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно, бо ВПК цілі числа зберігаються у зворотньому порядку розміщення байт числа:
ВПК: F0 3C 16
F0 3C16
wchar_t a[6]
un.a[0] = '1';
un.a[1] = '6';
un.a[2] = '8';
un.a[3] = '5';
un.a[4] = '9';
un.a[0] = '1';
ВПК: 31 00
31 00
un.a[1] = '6';
ВПК: 36 00
36 00
un.a[2] = '8';
ВПК: 38 00
38 00
un.a[3] = '5';
ВПК: 35 00
35 00
un.