Мiнiстерство освiти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
Кафедра ЕОМ
Курсова робота з дисципліни «Програмування. Частина ІІІ.Структури даних та алгоритми»
3.2.1 № варіанта = (((20 * 4) % 532) * 4 + 4) % 30 = 24
3.2.2 № варіанта = ((20 +4) * (532 +4)) % 30 = 24
3.2.3 № варіанта = (4 * 10 + 532 *4) % 30 = 8
3.2.4 № варіанта = (20 * 3 * 532 + (4 % 3) * 4) % 30 = 4
3.2.5 № варіанта = (20 + 4 + 532 * 4 +20* 4) % 30 = 12
Завдання на курсову роботу
Завдання 1. Визначити внутрішнє представлення в пам’яті комп’ютера даних базових типів. Розглянути основні прості (цілі, дійсні, символьні, логічні) типи даних:
Варіант: 4.2.
MN(4)%5 = 4;
DN(20)%6 = 2;
bool b;
wchar_t ch4;
long i6;
float d1;
Завдання 2: Внутрішні формати похідних типів
Визначити представлення в пам’яті комп’ютера рядків символів. Оголосити рядок символів і ініціалізувати його.
№ варіанта = (((день народження * номер будинку) % номер квартири) * місяць народження + номер будинку) % 30
№ варіанта = (((20 * 4) % 532) * 4 + 4) % 30 = 24
моб. тел..: 0968660234
char *string24 = "\\x\\n\33\x34\3hello3" "\\\"12\12";
Після цього виконати деякі переприсвоювання згідно варіанту.
string№ [0] = символ, що відповідає 3 цифрі string24 [0] = '6';
string№ [2] = символ, що відповідає 4 цифрі string24 [2] = '8';
string№ [4] = символ, що відповідає 5 цифрі string24 [4] = '6';
string№ [6] = символ, що відповідає 6 цифрі string24 [6 ] = '6';
string№ [8] = символ, що відповідає 7 цифрі string24 [8] = '0';
string№ [10] = символ, що відповідає 8 цифрі string24 [10] = '2';
string№ [12] = символ, що відповідає 9 цифрі string24 [12] = '3';
string№ [14] = символ, що відповідає 10 цифрі string24 [14] = '4';
Визначити представлення в пам’яті комп’ютера переліків. Оголосити три змінні перелікового типу і надати їм значення згідно варіанту.
Вибір варіанту індивідуального завдання:
№ варіанта = ((день народження + номер будинку) * (номер квартири + місяць народження)) % 30
№ варіанта = ((20 +4) * (532 +4)) % 30 = 24
Тестування провести для наступних значень змінних:
enum color24 {
BLUE,
GREEN,
CYAN = 3,
RED,
BROWN,
GRAY = -2,
YELLOW,
WHІTE,
MAGENTA = 1,
LІGHTGRAY,
DARKGRAY,
BLACK
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY;
Визначити представлення в пам’яті комп’ютера масивів. Оголосити масив та ініціалізувати його.
Вибір варіанту індивідуального завдання:
№ варіанта = (номер будинку * 10 + номер квартири * місяць народження) % 30
№ варіанта = (4 * 10 + 532 *4) % 30 = 8
Тестування провести для наступних значень змінних:
unsigned short array8[][2][3] = {{23,3,6}, {255}}
Після цього виконати переприсвоювання згідно варіанту.
array0[0][0][0] = 0; // 0 * 20 = 0
array0[0][0][1] = 180; // 9 * 20 = 180
array0[0][1][0] = 120; // 6 * 20 = 120
array0[0][1][1] = 160; // 8 * 20 = 160
array0[0][2][0] = 120; // 6 * 20 = 120
array0[0][2][1] = 120; // 6 * 20 = 120
array0[1][0][0] = 0; // 0 * 20 = 0
array0[1][0][1] = 40; // 2 * 20 = 40
array0[1][1][0] = 60; // 3 * 20 = 60
array0[1][1][1] = 80; // 4 * 20 = 80
Визначити представлення в пам’яті комп’ютера структур. Оголосити структуру, після цього надати всім елементам структури значення згідно варіанту.
Вибір варіанту індивідуального завдання:
№ варіанта = (день народження * 3 * номер квартири + (місяць народження % 3) * номер будинку) % 30
№ варіанта = (20 * 3 * 532 + (4 % 3) * 4) % 30 = 4
Тестування провести для наступних значень змінних:
struct str4 {
double a;
unsigned long e:12;
char c[10];
wchar_t f;
char d;
unsigned :0;
unsigned b:7;
long :13;
}str;
str.a = D.DM; // замість D підставити свій день народження
str.a = 20.80; // замість DM підставити значення, що дорівнює
// добутку дня народження на місяць народження
str.b = BD * KV * 124; // замість BD підставити номер свого будинку
str.b = 4 * 532 * 124 = 263 872; // замість KV підставити номер своєї квартири
str.c[0] = перша літера; str.c[0] = ‘V’
str.c[1] = друга літера; str.c[1] = ‘o’
str.c[2] = третя літера; str.c[2] = ‘l’
str.c[3] = четверта літера; str.c[3] = ‘o’
str.c[4] = п'ята літера; str.c[4] = ‘s’
str.d = 764 * BD * Х; // замість BD підставити номер свого будинку
str.d = 764*4*6=18 336; // замість Х підставити шосту з кінця цифру номера
// мобільного телефона
str.e = DN * MN * 36; // замість DN підставити свій день народження
str.e = 20 *4 * 36=2 880; // замість MN підставити свій місяць народження
str.f = Y; // замість Y підставити останню цифру номера
str.f = 4; // мобільного телефона
Визначити представлення в пам’яті комп’ютера об'єднань. Оголосити об'єднання, надати деяким елементам об'єднання початкові значення.
Вибір варіанту індивідуального завдання:
№ варіанта = (день народження + місяць народження + номер квартири * номер будинку +
+ день народження * місяць народження) % 30
№ варіанта = (20 + 4 + 532 * 4 +20* 4) % 30 = 12
Тестування провести для наступних значень змінних:
union un12 {
double b[2];
struct {
char a[8];
unsigned f[4];
};
char g[5];
short c;
float e;
} un;
un.e = KV * 325 + YEAR * DN; // замість KV підставити номер своєї квартири
un.e = 532 * 325 + 1992 * 20=212 740; // замість YEAR підставити свій рік народження
// замість DN підставити свій день народження
un.c = DN * (MN + BD) * 100; // замість MN підставити свій місяць народження
un.c = 20 * (4 + 4) * 100= 16 000; // замість BD підставити номер свого будинку
un.a[0] = символ, що відповідає 6 цифрі номера мобільного телефона; un.a[0] = ‘6’
un.a[1] = символ, що відповідає 7 цифрі номера мобільного телефона; un.a[1] = ‘0’
un.a[2] = символ, що відповідає 8 цифрі номера мобільного телефона; un.a[2] = ‘2’
un.a[3] = символ, що відповідає 9 цифрі номера мобільного телефона; un.a[3] = ‘3’
un.a[4] = символ, що відповідає 10 цифрі номера мобільного телефона; un.a[4] = ‘4’
Зміст
Вступ
Теоретична частина
Алгоритм розв’язання задачі
Система тестів
Внутрішні формати базових типів
Логічний тип
Символьний тип
Цілий тип
Дійсний тип
Внутрішні формати похідних типів
Рядок символів
Перерахування
Масив
Структура
Об’єднання
Результати виконання програми
Висновки
Список літератури
Додатки
Вступ
Дана курсова робота полягає у вивченні представлення в мові програмування С++ різних типів даних, як простих (логічний, символьний, дійсні, цілі), так і похідних(структури, масиви, перерахування, об’єднання)
Знати про структури даних важливо, оскільки від правильного вибору структур, на яких буде реалізуватися програмний продукт, залежить ефективність роботи програми. В цій роботі й буде продемонстровано, як саме різні типи даних зберігаються в комп’ютері.
Теоретична частина
1.1 Базові типи даних
1.1.1 Логічний тип даних
В мові C++ логічний тип (bool) характеризується двома значеннями: false (0) і true (1). В пам'яті комп'ютера змінна типу bool займає 1 байт. Логічні значення можна асоціювати зі значеннями типу int: значенню false відповідає нуль, значенню true відповідають всі інші числа.В арифметичних і логічних виразах логічні значення перетворюються в цілі числа. Арифметичні та бітові логічні операції виконуються над перетвореними величинами. Якщо результат приводиться знову до логічного типу, то 0 перетворюється в false, а ненульове значення перетворюється в true.
1.1.2 Символьні типи даних
Ідентифікатором символьного типу є ключове слово char. Символьні константи (символьні літерали) можна представляти як клавіатурні, кодові, кодові числові. Значеннями змінних типу char є множина символів таблиці ASCII. Код символу - це його порядковий номер у таблиці символів ASCІІ.
В пам’яті комп’ютера дані символьного типу зазвичай займають 1 байт. В цей байт записується порядковий номер символа в таблиці ASCII.
Символьна константа може мати префікс L (наприклад, L'a'), який означає спеціальний розширений символьний тип (wchar_t), що застосовується для зберігання символів національних алфавітів, якщо вони не можуть бути представлені звичайним однобайтовим типом char. Розмір цього типу залежить від реалізації; як правило, він відповідає типу short і займає 2 байта пам'яті.
1.1.3 Цілочисельні типи даних
Згідно зі стандартом мови С++ розмір типу int відповідає розміру машинного слова, властивому програмно-апаратній платформі конкретної системи програмування.
До типу int можна застосувати модифікатори long (довге ціле) та short (коротке ціле). Модифікатор типу long вказує, що дане буде займати не менше як 4 байти (у більшості систем програмування тип long має розмір саме 4 байти). Модифікатор short вказує, що дане не повинно перевищувати розмір типу int (у більшості реалізацій тип short займає 2 байти).
Тип int та його модифікації є знаковими типами. Це означає, що один біт (здебільшого найстарший) двійкового коду числа займає знак. Прийнято, що знак плюс позначається нулем, а знак мінус – одиницею. Від'ємні цілі числа у більшості комп'ютерних реалізацій зберігаються в доповнювальному коді.
Якщо певні дані набувають тільки додатних значень, то можна вдвічі збільшити діапазон їх додатних значень, оголосивши такі дані з модифікатором unsigned (беззнаковий). B беззнакових даних біт знака розглядається як звичайний числовий біт. Модифікатор unsigned можна застосовувати і до даних з типами long або short.
Внутрішнє представлення змінної цілого типу — ціле число у двійковому коді. Згідно формату IEEE всі додатні цілі числа зберігаються в пам'яті комп'ютера в прямому коді, а всі від'ємні – в доповняльному коді. Цілі числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
1.1.4 Дійсні типи даних
Для збереження й опрацювання дійсних чисел (тобто чисел, що складаються з цілої та дробової частин) мова С++ підтримує три дійсних типи: 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. Таким чином, максимальний по модулю від'ємний порядок представляється нульовим кодом.
Дійсні числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
1.2 Похідні типи даних
1.2.1 Тип даних «Рядок»
По своїй суті тип рядок є ідентичним типу даних масив. Елементи рядка зберігаються в пам’яті комп’ютера так само, як і елементи масиву. Відмінністю є тільки те, що базовим типом для рядка є лише тип char[], та обмеження кількості елементів до 255.
1.2.2 Тип даних «Перерахування» («Перелік»)
Змінна, котра може приймати значення з деякого списку значень, називається змінною перелічуваного типу або переліком. Оголошення переліку задає тип змінної переліку і визначає список іменованих констант, що називається списком переліку. Імена елементів списку переліку задаються в фігурних дужках через кому.
Значенням кожного імені списку є деяке ціле число. Змінна типу переліку може приймати значення однієї з іменованих констант списку.
Кожен ідентифікатор іменує елемент переліку. Всі ідентифікатори в списку переліку повинні бути унікальними і повинні відрізнятись від всіх інших ідентифікаторів в тій самій області видимості, включаючи імена звичайних змінних та ідентифікатори з інших списків переліку. У випадку відсутності константного виразу перший ідентифікатор набуває значення 0, наступний ідентифікатор - значення 1, наступний - 2 і т.д. Отже, пам'ять, що відводиться під змінну типу перелік - це пам'ять, необхідна для розміщення значення типу іnt.
Ідентифікатор, зв'язаний з константним виразом, приймає значення, що задається цим константним виразом. Константний вираз повинен мати тип іnt і може бути як додатнім, так і від’ємним. Константні вирази можуть містити однакові значення. Наступний ідентифікатор в списку отримує значення, рівне константному виразу плюс 1, якщо цей ідентифікатор не має свого константного виразу.
1.2.3 Тип даних «Масив»
Масив - це однорідна складена структура даних статичної структури. Кожен компонент масиву характеризується своїм індексом. Допустимими типами індексів є всі порядкові типи. Для доступу до елементів масиву необхідно вказати ідентифікатор масиву з одним чи кількома індексами в дужках. Він зберігається як неперервна послідовність змінних того типу, якого оголошені елементи масиву.
Розмір пам'яті, що відводиться для зберігання масиву, обчислюється як добутку кількості елементів на розмір елемента.
Елементи масиву з найменшим індексом зберігаються по найменшій адресі пам’яті. Багатовимірні масиви зберігаються так, що найбільш правий індекс збільшується першим.
1.2.4 Тип даних «Структура»
На відміну від масиву, всі елементи якого однотипні, структура може містити елементи різних типів. В мові C++ структура є видом класу і має всі його властивості, але в багатьох випадках достатньо використовувати структури так, як вони визначені в мові С:
struct [ім'я_типу] {
тип_1 елемент _1:
тип_2 елемент _2;
тип_n елемент _n;
} [ список_оголошень ];
Елементи структури називаються полями структури і можуть мати будь-які типи, крім типу цієї ж структури, але можуть бути вказівниками на неї.
Для змінних одного й того ж структурного типу визначена операція присвоювання, при цьому відбувається поелементне копіювання. Структуру можна передавати в функцію і повертати як значення функції. Доступ до полів структури виконується за допомогою операцій вибору: "." (крапка) - при звертанні до поля через ім'я структури і "->" - при звертанні через вказівник. У пам'яті комп’ютера під кожний елемент структури виділяється визначений відповідно до типу цього елемента об’єм пам'яті. Елементи в пам'яті зберігаються в тому ж порядку, в якому вони були представлені в описі структури.
Розмір змінної структурного типу не можна обчислити просто як суму його елементів, тому що змінні певних типів мають вирівнюватись в пам'яті комп’ютера по деяким залежним від реалізації границям.
1.2.5 Тип даних «Об’єднання»
Об’єднання дуже схожі на структури. Однак на відміну від структури об'єднання зберігає значення тільки одного елемента в кожний момент часу. Інакше кажучи, коли виконується операція присвоювання значення елементу об'єднання, то перезаписується будь-яке попереднє присвоювання.
Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найбільш довгого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити зайву пам'ять, що не використовується. Всі елементи об'єднання зберігаються в одній і тій cамій області пам'яті, починаючи з однієї адреси.
Алгоритм розв’язання задачі
До виконання кожного завдання я підходив по-різному, тобто кожне завдання потребувало іншого підходу до розв’язання. Основні підходи показані у пункті Система тестів або наведені безпосередньо у коментарях програми.Система тестів
3.1 Базові типи даних
3.1.1 Логічний тип даних
b = (день народження * 5) % 10 * місяць народження;
b = (20 * 5) % 10 * 4 = 0
Представлення логічної змінної bool b = 0;
Оскільки значення змінної b нульове, отже b = false(0).
В пам’яті комп’ютера змінна b зберігається послідовність біт: 0000 0000.
В 16-ковій системі числення: 0016
Відповідь : 0016.
3.1.2 Символьний тип даних
Представлення символьної змінної :
wchar_t ch4;
ch4 = остання літера прізвища ‘n’
За таблицею кодів ASCIІ: символ ’n’ має порядковий номер 11010.
11010 = 6E16 = 110 11102
Тип wchar_t в пам’яті комп’ютера займає 2 байти.
Отже, цей символ в пам’яті комп’ютера буде представлений як послідовність:
0000 0000 0110 11102 ->16-ковій системі числення: 00 6E16
Відповідь : 6Е 00 16.
3.1.3 Цілий тип даних
long i6;
i6 = – i5;
i5 = день народження * 352 ;
i5 = 20*352= 7 04010
i6 = - 7 04010
Від'ємне число -7 040 типу long int в пам'яті комп’ютера зберігається в доповняльному двійковому коді і займає 4 байти: - 7 04010 = -1B8016 = - 1 1011 1000 00002
0000 0000 0000 0000 0001 1011 1000 0000 - прямий код;
1111 1111 1111 1111 1110 0100 0111 1111 - обернений код;
+ 1
1111 1111 1111 1111 1110 0100 1000 0000 - доповняльний код;
F F F F E 4 8 0 - в 16- ковій системі числення
В пам’яті комп’ютера зберігається у зворотному порядку розміщення байт числа:
1000 0000 1110 0100 1111 1111 1111 11112 -> в 16- ковій системі числення: 80 E4 FF FF
Відповідь : 80 E4 FF FF 16
3.1.4 Дійсний тип даних
float d1
X – день народження(20), Y – місяць народження(4), Z = X * Y; Z = 20 *4=80
d1 = – Z . X e – Y;
d1 = – 80 .20 e – 4;
– 80 .20 e – 4 – константа еквівалентна -0.0080210
Оскільки у нас відсутня ціла частина , то перевід дробової частини:
0,00802* 16 = 0,12832
0,12832* 16 = 2,05312
0,05312* 16 = 0,84992
0,84992* 16=13,59872 1310=D16
0,59872* 16 = 9,57952
0,57952*16 = 9,27232
0,27232*16 = 4,35712
0,35712*16 = 5,71392
Отже: 0.0080210= 0,020D994516 = 0,0000 0010 0000 1101 1001 1001 0100 01012
Нормалізація: 1,0 0000 1101 1001 1001 0100 01012 * 10 -0111
Заокруглення:
1 , 0 0000 1101 1001 1001 0100 01│0 1
+ 0
1 , 0 0000 1101 1001 1001 0100 01
Визначення мантиси: m=0 0000 1101 1001 1001 0100 01
Визначення зміщеного порядку: е = 12710 - 710 = 12010 = 7816 = 0111 10002
Визначення знакового розряду: s=1 (бо число від’ємне ).
Схема внутрішнього представлення:
s
e
m
1 біт
8 біт
23 біт
Зборка за схемою:
s
e
m
1
0111 1000
0 0000 1101 1001 1001 0100 01
В 16- ковій системі числення: 1011 1100 0000 0011 0110 0110 0101 00012 = BC 03 66 5116
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа:
0101 0001 0110 0110 0000 0011 1011 1100 2
Результат в 16- ковій системі числення: 51 66 03 BС.
Відповідь : 51 66 03 BС.
3.2 Похідні типи даних
3.2.1 Рядок символів
char *string24 = "\\x\\n\33\x34\3hello3" "\\\"12\12";
string24 [0] = '6';
string24 [2] = '8';
string24 [4] = '6';
string24 [6] = '6';
string24 [8] = '0';
string24 [10] = '2';
string24 [12] = '3';
string24 [14] = '4';
Розіб’ємо рядок на окремі біти :
char *string24 = "\\x\\n\33\x34\3hello3" "\\\"12\12";
string24= ‘\’ ‘ x’ ‘\’ ‘n’ ‘338’ ‘3416’ ‘38’ ‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘'3'’ ‘\’ ‘ ’’ ’ ‘'1'’ ‘ '2'’ ‘128’
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9][10][11] [12] [13] [14] [15] [16] [17]
Після виконання операцій переприсвоювання рядок матиме вигляд:
string24 = ‘'6'’ ‘x’ ‘'8'’ ‘n’ ‘'6'’ ‘3416’ ‘'6'’ ‘h’ ‘'0'’ ‘l’ ‘'2'’ ‘o’ ‘'3'’ ‘\’ ‘'4'’ ‘'1'’ ‘ '2'’ ‘128’
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11][12] [13][14][15] [16] [17]
36 78 38 6E 36 34 36 68 30 6C 32 6F 33 5C 34 31 32 0A
ВПК рядок буде відображатись як послідовність обернених байт.Останньою буде записана ознака кінця рядка \0 (в 16-ковій системі - 00).
Отже, в пам’яті комп’ютера рядок зберігатиметься як послідовність:
Відповідь: ВПК:36 78 6E 36 34 36 68 30 6C 32 6F 33 5C 34 31 32 0A 00.
3.2.2 Переліки
enum color24 {
BLUE,
GREEN,
CYAN = 3,
RED,
BROWN,
GRAY = -2,
YELLOW,
WHІTE,
MAGENTA = 1,
LІGHTGRAY,
DARKGRAY,
BLACK
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY;
Значення кожного елемента переліку:
BLUE = 0
RED = 4
YELLOW =-1
LІGHTGRAY = 2
GREEN = 1
BROWN = 5
WHІTE = 0
DARKGRAY = 3
CYAN = 3
GRAY = -2
MAGENTA = 1
BLACK = 4
Змінна с1 = CYAN (3), зберігатиметься в прямому коді і займатиме 4 байти (int).
310 = 0000 0000 0000 0000 0000 0000 0000 00112 = 00 00 00 0316
В пам’яті комп’ютера результат зберігатиметься в зворотному розміщенні байт числа:03 00 00 00
Відповідь : 0316.
Змінна с2 = BROWN = (5), зберігатиметься в прямому коді і займатиме 4 байти (int).
510 = 0000 0000 0000 0000 0000 0000 0000 01012 = 00 00 00 0516
В пам’яті комп’ютера результат зберігатиметься в зворотному розміщенні байт числа: 05 00 00 00
Відповідь :05.16.
Змінна с3=DARKGRAY=(3), зберігатиметься в доповняльному коді і займатиме 4 байти (int).
310 = 0000 0000 0000 0000 0000 0000 0000 00112 = 00 00 00 0316
В пам’яті комп’ютера результат зберігатиметься в зворотному розміщенні байт числа: 03.
Відповідь :0316.
3.2.3 Масив
unsigned short array8[][2][3] = {{23,3,6}, {255}}
array 8[0][0][0] = 0; // 0 * 20 = 0
array 8[0][0][1] = 180; // 9 * 20 = 18010 = B416
array 8[0][0][2] = 120; // 6 * 20 = 12010= 7816
array8 [0][1][0] = 160; // 8 * 20 = 16010=A016
array8 [0][1][1] = 120; // 6 * 20 = 12010=7816
array8 [0][1][2] = 120; // 6 * 20 = 12010=7816
array8 [1][0][0] = 0; // 0 * 20 = 0
array8 [1][0][1] = 40; // 2 * 20 = 4010=2816
array8 [1][0][2] = 60; // 3 * 20 = 6010= 3C16
array8 [1][1][0] = 80; // 4 * 20 = 8010=5016
array8[0][0][0] = 23; array8[0][0][1] = 3; array8[0][0][2] = 6;
array8[0][1] [0] = 0; array8[0][1][1] = 0; array8[0][1][2] = 0;
array8[1][0][0] = 255; array8[1][0][1] = 0; array8[1][0][2] = 0;
array8[1][1][0] = 0; array8[1][1][1] = 0; array8[1][1][2] = 0;
Після переприсвоєння масив набуде значень (десяткових):
array8[0][0][0] = 0; array8[0][0][1] = 180; array8[0][0][2]=120;
array8[0][1] [0] = 160; array8[0][1][1] =120 ; array8[0][1][2] =120;
array8[1][0][0] = 0; array8[1][0][1] = 40; array8[1][0][2] = 60;
array8[1][1][ 0] = 80; array8[1][1][1] = 0; array8[1][1][2] = 0;
В пам’яті комп’ютера масив зберігається як послідовність чисел яка читається зліва направо і зверху вниз по матрицях масиву, при чому байти числа записані в зворотньому порядку у шістнадцятковій системі числення.
Тип unsigned short займає у ПК 2 байти, тому :
Відповідь : 0000 B400 7800 A000 7800 7800 0000 2800 3С00 5000 0000 000016.
3.2.4 Структура
struct str4 {
double a;
unsigned long e:12;
char c[10];
wchar_t f;
char d;
unsigned :0;
unsigned b:7;
long :13;
}str;
str.a = 20.80;
str.b = 263 872;
str.c[0] = ‘V’
str.c[1] = ‘o’
str.c[2] = ‘l’
str.c[3] = ‘o’
str.c[4] = ‘s’
str.d =18 336;
str.e =2 880;
str.f = 4;
Структура, полям якої не присвоєно ніяких значень має всі байти однаковими і їх початковим значенням є число С16, тому це може впливати на відображення певних полів при виводі зображення структури в пам’яті.
Визначимо представлення в пам'яті комп’ютера окремо кожного поля:
Представлення кожного поля в пям’яті комп’ютера:
Представлення дійсної змінної : double а = 20.810;
Назва
типу
Іденти-фікатор
Діапазон значень
Внутрішній формат:
s–знак,e–експонента,m–мантиса
Значення числа
Розмір пам’яті в байтах
Дійсне подвійної точності
double
від 1.710-308
до 1.710308
1 біт 11 біт 52 біта
s
e
m
(-1)S1,m2e –1023
8
Перевід цілої частини:
2010 =>1416
Перевід дробової частини:
0,8 * 16 = 12,8 1210=С16
0,8 * 16 = 12,8 1210=С16 …(С)
20,810 = 14,ССССССССССССС16 =
=0001 0100, 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 11002
Нормалізація:
0001 0100, 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 11002* 100100
Заокруглення:
1, 0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 │1100
+ 1
1, 0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101
Визначення мантиси: m=0100 110011001100 1100 1100 1100 1100 1100 1100 1100 1100 1101
Визначення зміщеного порядку: е = 102310 + 410 = 102710 = 40316 = 100 0000 00112
Визначення знакового розряду: s=0 (бо число додатнє).
Схема внутрішнього представлення:
Зборка за схемою:
s
e
m
0
100 0000 0011
0100 110011001100 1100 1100 1100 1100 1100 1100 1100 1100 1101
В 16- ковій системі числення:
0100 0000 0011 0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 11012=
= 40 34 СС СС СС СС СС СD16
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа:
1100 1100 1100 1101 1100 1100 1100 1100 1100 1100 1100 1100 0000 1000 0011 0100
Відповідь: ВПК :СD СС СС СС СС СС 34 4016.
Представлення змінної unsigned long e:12;
e = 288010 = В 4016 // оскільки у числі не вистачає перших 4 біт то компілятор замінить невизначене значення на С --> CВ 4016
Нам відомо лише 2 байти, а тип unsigned long int займає 4, тому порожні поля заповняться на СС
Відповідь: ВПК : 40 СВ СС СС16.
Представлення змінної char c[10]:c[0] = ‘V’ = 5616c[1] = ‘o’ = 6F16c[2] = ‘l’ = 6C16c[3] = ‘o’ = 6F16c[4] = ‘s’ = 7316
Значення елементів c[5], c[6], c[7] , c[8] , c[9] залишаються невизначеними.В пам’яті комп’ютера рядок зберігатиметься як:Відповідь: ВПК : 56 6F 6C 6F 73 CC CC CC CC CC 16.
Представлення змінної wchar_t f :4;f = 410 = 0000 0000 0000 01002 = 00 0416
Відповідь: ВПК : 04 0016.
Представлення змінної char d;
char d =18 33610= 47 A016
Відповідь: ВПК : A016.
Представлення змінної unsigned b:7
b=26387210= 4 06 C016=0100 0000 0110 1100 0000 2
Оскільки b:7, то b = 1100 00002 = C016
Відповідь: ВПК :C016.
Для розміщення даної структури