Представлення статичних данних в пам’яті комп’ютера

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2012
Тип роботи:
Курсова робота
Предмет:
Програмування

Частина тексту файла (без зображень, графіків і формул):

Національний університет “Львівська політехніка” Кафедра ЕОМ Курсова робота ( частина І ) На тему: “Представлення статичних данних в пам’яті комп’ютера” з дисципліни: "Програмування" Вибір варіантів індивідуального завдання: Завдання 1: № варіанта = ((12 % 5),(10 % 6)) = (2,4) Завдання 2.1: № варіанта = (((10 * 47) % 44) * 12 + 47) % 30 = 17 Завдання 2.2: № варіанта = ((10+ 47) * (44 + 12)) % 30 = 12 Завдання 2.3: № варіанта = (47 * 10 + 44 * 12) % 30 = 8 Завдання 2.4: № варіанта = (10* 3 * 44 + (12% 3) * 47) % 30 = 0 Завдання 2.5: № варіанта = (10 + 12 + 44 * 47 + 10*12) % 30 = 20 Львів – 2012 ЗАВДАННЯ НА КУРСОВУ РОБОТУ Завдання 1 bool b = (10*5)%10*12 = 0*12 = 0; //але так, як це тип bool, то він може приймати значення або 1, або 0, в моєму випадку – 0 signed char ch3 = “v”; short i2 = -i1 = -10*125 = -1250; double d2 = 120.1e+12; Завдання 2 Визначити внутрішнє представлення в пам’яті комп’ютера даних похідних типів 2.1. Представлення рядків символів. Визначити представлення в пам’яті комп’ютера рядків символів. char *string17 = "\x34\\fdg\v\n3""""\\fh2l\\v\\"""; Та виконати наступні переприсвоювання: string0[0]='3'; string0[2]='1'; string0[4]='8'; string0[6]='4'; string0[8]='7'; string0[10]='8'; string0[12]='4'; string0[14]='8'; 2.2. Представлення переліків. Визначити представлення в пам’яті комп’ютера переліків. enum color12 { BLUE, GREEN, CYAN = 0, RED, BROWN, GRAY, YELLOW = 8, WHІTE, MAGENTA, LІGHTGRAY, DARKGRAY, BLACK } c1= CYAN, c2= BROWN, c3= DARKGRAY; 2.3. Представлення масивів. Визначити представлення в пам’яті комп’ютера масивів. unsigned short array8[][2][3] = {{23,3,6}, {255}} Для кожного варіанту виконати наступні переприсвоювання: 1-ий елемент масиву = 0 * 10 = 0; 2-ий елемент масиву = 6 * 10 = 60; 3-ий елемент масиву = 3 * 10 = 30; 4-ий елемент масиву = 1 * 10 = 10; 5-ий елемент масиву = 8 * 10 = 80; 6-ий елемент масиву = 4 * 10 = 40; 7-ий елемент масиву = 7 * 10 = 70; 8-ий елемент масиву = 8 * 10 = 80; 9-ий елемент масиву = 4 * 10 = 40; 10-й елемент масиву = 8 * 10 = 80; 2.4. Представлення структур. Визначити представлення в пам’яті комп’ютера структур. struct str0 { long d; double a; char c[5]; unsigned : 2; unsigned :5; unsigned e:3; unsigned b:3; unsigned :0; wchar_t f; }str; Для кожного варіанту виконати надання значень елементам структури : str.a = 10.12; str.b = 47* 44* 124 = 256432; str.c[0] = 'T'; str.c[1] = 's'; str.c[2] = 'v'; str.c[3] = 'e'; str.c[4] = 'l'; str.d = 764 * 47 * 8 =287264; str.e = 10 * 12 * 36 = 4320; str.f = '8'; 2.5. Представлення об'єднань. Визначити представлення в пам’яті комп’ютера об'єднань. union un20 { int b; struct { char c; double e; }; struct { double f; char a[10]; }; } un; un.e = 44 * 325 + 1992 * 10 = 34220; un.c = 10 * (12 + 47) * 100 = 59000; un.a[0] = '4'; un.a[1] = '7'; un.a[2] = '8'; un.a[3] = '4'; un.a[4] = '8'; ЗМІСТ 1. ТЕОРЕТИЧНА ЧАСТИНА……………………………………………………………………....5 2. Система тестів……………………………………………………………………………………10 2.1. Завдання 1……………………………………………………………………………….....10 2.1.1. Логічний тип……………………………………………………………………...10 2.1.2. Символьний тип………………………………………………………………….10 2.1.3. Цілий тип…………………………………………………………………………10 2.1.4. Дійсний тип………………………………………………………………………10 2.2. Завдання 2………………………………………………………………………………....10 2.2.1. Представлення рядків символів…………………………………………………11 2.2.2. Представлення переліків……………………………………………………….. 11 2.2.3. Представлення масивів…………………………………………………………..12 2.2.4. Представлення структур…………………………………………………………12 2.2.5. Представлення об'єднань………………………………………………………. 14 3. АЛГОРИМ РОЗВЯЗАННЯ ЗАДАЧІ…………………………………………………………..17 3.1. Словесний опис алгоритму………………………………………………..17 3.2. Граф-схема алгоритму……………………………………………………..17 5. РЕЗУЛЬТАТИ ВИКОНАННЯ ПРОГРАМИ…………………………………………………..18 ВИСНОВКИ………………………………………………………………………………………..19 СПИСОК ЛІТЕРАТУРИ…………………………………………………………………………..20 ДОДАТОК А……………………………………………………………………………………… 21 ТЕОРЕТИЧНА ЧАСТИНА Типи short, іnt і long призначені для представлення цілих чисел. Цілі типи можуть бути знаковими (sіgned) і беззнаковими (unsіgned). В знакових типах самий лівий біт використовується для зберігання знака числа (0 – плюс, 1 – мінус). Решта бітів містять числове значення. В беззнакових типах всі біти використаються для числового значення. За замовчуванням всі цілочисельні типи вважаються знаковими. Цілі типи розрізняються діапазоном значень, які можуть приймати цілочисельні змінні і розміром області пам'яті, виділеної під цю змінну, а конкретні розміри перерахованих типів залежать від конкретної реалізації. Так, представлення в пам'яті і область значень для типів іnt і unsіgned іnt чітко не визначені в мові С++. За замовчуванням розмір іnt (зі знаком і без знака) відповідає реальному розміру цілого на даній машині. Наприклад, на 16-ти розрядній машині тип іnt завжди займає 16 розрядів або 2 байта. На 32-х розрядній машині тип іnt завжди займає 32 розряди або 4 байта. Таким чином, тип іnt буде еквівалентним типам short іnt або long іnt залежно від реалізації. Аналогічно, тип unsіgned іnt еквівалентний типам unsіgned short або unsіgned long. Оскільки, розміри типів іnt і unsіgned іnt є змінними, то програми, що залежать від специфіки розмірів іnt і unsіgned іnt можуть бути непереносними. Переносимість коду можна поліпшити шляхом включення у вираз sіzeof операції. Дійсні константи записуються у двох формах – з фіксованою десятковою крапкою або в експонентному виді. В першому випадку крапка використовується для поділу цілої і дробової частин константи. Як ціла, так і дробова частини можуть бути відсутніми (наприклад 1.2, 0.725, 1., .35, 0.). В трьох останніх випадках відсутня або дробова, або ціла частина. Десяткова крапка повинна обов'язково бути присутньою, інакше константа буде вважатись цілою. Експонентна форма запису дійсної константи містить знак, мантису і десятковий порядок (експоненту). Мантиса – це будь-яка додатня дійсна константа у формі з фіксованою крапкою або цілою константою. Порядок вказує степінь числа 10, на яку домножується мантиса. Порядок відокремлюється від мантиси буквою 'E' або 'e' (від слова exponent). Порядок може мати знак плюс або мінус, у випадку додатнього порядку знак плюс можна опускати. Наприклад: 1.5e+6 - константа еквівалентна 1500000.0 1e-4 - константа еквівалентна 0.0001 -.75E3 - константа еквівалентна -750.0 У мові С++ дійсні типи або типи з рухомою комою представляються трьома розмірами, що характеризують точність представлення дійсних чисел: float – одиничної точності; double - подвійної точності; long double – розширеної точності (у деяких реалізаціях тип long double може бути відсутній) Константи з рухомою комою мають за замовчуванням тип double. Саме він є найбільш природнім для комп'ютера. У програмуванні треба по можливості уникати типу float, тому що його точність недостатня, а процесор однаково при виконанні операцій перетворить його в тип double. Один з випадків, де застосування типу float виправдане – тривимірна комп'ютерна графіка. Можна явно вказати тип константи за допомогою суфіксів F, f (float) і L, l (long). Наприклад, константа 2E+6L буде мати тип long double. В пам'яті комп'ютера змінна типу float займає 4 байти, в яких один біт виділяється під знак, 8 – під порядок, 23 – під мантису. Розряди мантиси включають один розряд цілої частини, що завжди дорівнює одиниці, і фіксовану кількість розрядів дробової частини. Оскільки старший двійковий розряд мантиси завжди дорівнює одиниці, зберігати його необов'язково, і у двійковому коді він відсутній. Фактично двійковий код зберігає тільки розряди дробової частини мантиси. Отже, насправді, у типу float мантиса містить 24 розряди, але старший розряд завжди дорівнює одиниці, тому зберігати його не потрібно. Тип double займає 8 байт, у яких один розряд виділяється під знак, 11 – під порядок, 52 – під мантису. Насправді в мантисі 53 розряди, але старший завжди дорівнює одиниці і тому не зберігається. Тип long double займає 10 байт (або 8 байт), в яких один розряд виділяється під знак, 15 – під порядок, інші 64 – під мантису. Записуються всі 64 розряди мантиси разом зі старшою одиницею. Оскільки порядок може бути додатній і від'ємний, у двійковому коді він зберігається в зміщеному виді: до нього додається константа, яка рівна абсолютній величині максимального по модулю від'ємного порядку. У випадку типу float вона дорівнює 127, у випадку double – 1023, long double – 16383. Таким чином, максимальний по модулю від'ємний порядок представляється нульовим кодом. Дійсні числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа. Таблиця 4.7 Назва типу Іденти-фікатор Діапазон значень Внутрішній формат: 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)*   Змінна, котра може приймати значення з деякого списку значень, називається змінною перелічуваного типу або переліком. Оголошення переліку задає тип змінної переліку і визначає список іменованих констант, що називається списком переліку. Імена елементів списку переліку задаються в фігурних дужках через кому. Значенням кожного імені списку є деяке ціле число. Змінна типу переліку може приймати значення однієї з іменованих констант списку. Змінні типу enum можуть використовуватись і як операнды в арифметичних операціях та в операціях відношення, і як індекси в індексних виразах. Список переліку може містити одну або декілька конструкцій виду: ідентифікатор [= константний вираз] Кожен ідентифікатор іменує елемент переліку. Всі ідентифікатори в списку переліку повинні бути унікальними і повинні відрізнятись від всіх інших ідентифікаторів в тій самій області видимості, включаючи імена звичайних змінних та ідентифікатори з інших списків переліку. У випадку відсутності константного виразу перший ідентифікатор набуває значення 0, наступний ідентифікатор - значення 1, наступний - 2 і т.д. Отже, пам'ять, що відводиться під змінну типу перелік - це пам'ять, необхідна для розміщення значення типу іnt. Ідентифікатор, зв'язаний з константним виразом, приймає значення, що задається цим константним виразом. Константний вираз повинен мати тип іnt і може бути як додатнім, так і від’ємним. Константні вирази можуть містити однакові значення. Наступний ідентифікатор в списку отримує значення, рівне константному виразу плюс 1, якщо цей ідентифікатор не має свого константного виразу. Вказівники - Коли компілятор обробляє оператор визначення змінної, наприклад, іnt і=10, він виділяє пам'ять відповідно до типу (в прикладі іnt) та ініціалізує її заданим значенням (в прикладі 10). Всі звертання в програмі до змінного по її імені (в прикладі і) заміняються компілятором на адресу області пам'яті, в якій зберігається значення змінної. Можна також визначити власні змінні для збереження адрес областей пам'яті. Такі змінні називаються вказівниками. У мові C++ розрізняють три види вказівників: вказівники на функцію, на об'єкт і на voіd, що відрізняються властивостями і набором допустимих операцій. Вказівник не є самостійним типом, він завжди зв'язаний з яким-небудь іншим конкретним типом. Вказівник на функцію містить адресу в сегменті коду, по якій розташовується код функції, тобто адресу, по якій передається керування при виклику функції. Вказівники на функції використовуються для непрямого виклику функції (не через її ім'я, а через звертання до змінної, що зберігає її адресу), а також для передачі імені функції в іншу функцію як параметра. Вказівник на функцю має тип "вказівник функції, що повертає значення заданого типу і має аргументи заданого типу": тип (*ім'я) ( список_типів_аргументів ); Наприклад, оголошення іnt (*fun) (double, double); задає вказівник на функцію з ім'ям fun, що повертає значення типу іnt і має два аргументи типу double. Вказівник на об'єкт містить адресу області пам'яті, у якій зберігаються дані визначеного типу (базового або похідного). Найпростіше оголошення вказівника на об'єкт (далі будемо називати просто вказівник) має вигляд: тип *ім'я; де тип може бути довільним, крім посилання і бітового поля, причому тип може бути до цього моменту тільки оголошений, але ще не визначений (наприклад, в структурі може бути присутнім вказівник на структуру того ж типу). Можна визначити вказівник на вказівник. Зірочка відноситься безпосередньо до імені, тому для того, щоб оголосити кілька вказівників, потрібно ставити її перед ім'ям кожного з них. Наприклад, в операторі іnt *a, b, *c; описуються два вказівники на ціле з іменами а і с, а також ціла змінна b. Розмір вказівника залежить від моделі пам'яті. Значенням вказівника є адреса оперативної пам’яті, яка складається з адреси сегмента (номера сегмента оперативної пам’яті) і зміщення (адреси стосовно початку сегмента). Формат адреси: <сегмент> : <зміщення> Адреса сегмента зберігається в старшому слові, а зміщення – у молодшому слові повної адреси. Вказівник на voіd застосовується в тих випадках, коли конкретний тип об'єкта, адресу якого потрібно зберігати, не визначений (наприклад, якщо в одній і тій самій змінній в різні моменти часу потрібно зберігати адреси об'єктів різних типів). Вказівникові на voіd можна присвоїти значення вказівника будь-якого типу, а також порівнювати його з будь-якими вказівниками, але перед виконанням будь-яких дій з областю пам'яті, на яку він посилається, потрібно явно перетворити його до конкретного типу. Вказівник може бути константою або змінною, а також вказувати на константу або змінну. Масив - це впорядкований скінченний набір даних одного типу, які зберігаються в послідовно розташованих комірках оперативної пам'яті і мають спільну назву. З оголошення масиву компілятор одержує інформацію про тип елементів масиву та їх кількість. Якщо початкових значень меньше, ніж елементів в масиві, то елементам, що залишились автоматично надаються нульові початкові значення. Наприклад, елементам масиву b можна присвоїти нульові початкові значення за допомогою оголошення int b[12] = {3, 2, 1}; яке явно надає початкові значення першим трьом елементам масиву і неявно надає нульові початкові значення решті дев’яти елементам, оскільки початкових значень меньше, ніж оголошено елементів масиву. Однак, по замовчуванню автоматично масив не отримує нульові початкові значення неявно. Треба присвоїти нульові початкові значення хоча б першому елементу для того, щоб автоматично були обнулені всі решта елементів, наприклад: int b[5] = {0}; // аналогічно присвоєнням : b[0]=0; b[l]=0; b[2]=0; b[3]=0; b[4]=0; Синтаксичною помилкою буде задання в списку більшої кількості початкових значень, ніж є елементів в масиві. Наприклад, оголошення масиву int b[5] = {5, 4, 3, 2, 1, 0}; призведе до синтаксичної помилки, оскільки список ініціалізації містить 6 початкових значень, а масив має тільки 5 елементів. Багатовимірні масиви компілятор розглядає як послідовність одновимірних, тому до елементів такого масиву, як і для одновимірних, можна також звертатись через вказівники. В пам'яті комп'ютера елементи масиву з першого до останнього запам'ятовуються в послідовних зростаючих комірках пам'яті. Між елементами масиву в пам'яті розриви відсутні. Елементи масиву з найменшим індексом зберігаються по найменшій адресі пам’яті. Багатовимірні масиви в пам'яті комп'ютера зберігаються так, що найбільш правий індекс збільшується першим. Приклад. Розглянемо двовимірний масив цілих чисел: іnt mass [3][2]= { {1, 1}, {0, 2}, {1, 3} }; В пам’яті комп’ютера він зберігається у такому виді: 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000 mass [0][0] mass [0][1] 00000000 00000000 00000000 00000010 00000000 00000000 00000000 00000001 00000000 mass [1][0] mass [1][1] 00000000 00000000 00000011 00000000 00000000 00000000 mass [2][0] mass [2][1] Структура. На відміну від масиву, всі елементи якого однотипні, структура може містити елементи різних типів. В мові C++ структура є видом класу і має всі його властивості, але в багатьох випадках доситатньо використовувати структури так, як вони визначені в мові С: struct [ім'я_типу] { тип_1 елемент _1: тип_2 елемент _2; тип_n елемент _n; } [ список_оголошень ]; Елементом структури може бути бітове поле, що забезпечує доступ до окремих бітів пам'яті. Поза структурами бітові поля використовувати не можна. Бітові поля - це особливий вид полів структури. Вони використовуються для щільного упакування даних, наприклад, прапорців типу "так/ні". Найменьша по довжині комірка пам'яті, яку можна адресувати - 1 байт, а для збереження прапорця досить одного біта. При описі бітового поля після імені через двокрапку вказується довжина поля в бітах, що задається цілим виразом або константою. Поле нульової довжини означає вирівнювання на границю наступного слова. Допускаються неіменовані поля бітів. Вони не впливають на зміст іменованих полів, але певним чином можуть поліпшувати розміщення полів в пам'яті. Структури бітових полів можуть містити і знакові елементи. Але, навіть цілі поля можуть розглядатись як беззнакові. Тому рекомендується описувати бітові поля як unsіgned. В пам'яті бітові поля розміщуються на відповідних границях слів, при цьому деякі біти слів можуть залишатись невикористаними. Поле, яке не можна розмістити у місце, що залишилося до границі слова, розміщується в наступне слово. Поле не може бути ширшим за слово. На деяких машинах бітові поля розміщуються справа наліво, а на деяких – зліва направо. Об'єднання дуже схожі на структури. Однак на відміну від структури об'єднання зберігає значення тільки одного елемента в кожний момент часу. Інакше кажучи, коли виконується операція присвоювання значення елементу об'єднання, то перезаписується будь-яке попереднє присвоювання. Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найбільш довгого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити зайву пам'ять, що не використовується. Всі елементи об'єднання зберігаються в одній і тій cамій області пам'яті, починаючи з однієї адреси. СИСТЕМА ТЕСТІВ 2.1. Завдання 1. Внутрішні формати базових типів Визначити внутрішнє представлення в пам’яті комп’ютера даних базових типів. Розглянути основні прості (цілі, дійсні, символьні, логічні) типи даних: 2.1.1. Логічний тип bool b = 0; Для представлення змінної типу bool достатньо всого 1 біта, але у пам’яті комп’ютера на змінну типу bool виділяється 1 байт, отже оскільки b = 0, то ВПК (b) – 0016 2.1.2. Символьний тип char ch3 = “v”; Змінна типу char займає в пам’яті комп’ютера 1 байт. ASCII код латинської літери ‘H’ – 7616. Для отримання значення змінної ВПК, необхідно перевести це число до двійкової системи числення. 7616 = 0111 01102. Отже, ВПК (ch3) - 0111 01102, або 7616 2.1.3. Цілий тип short i2 = -1250; Змінна типу short в представленні комп’ютера займає два байти, отже результат також число, яке займає два. Переведемо число у 16-ву і 2-ву систему. -1250 = - 4E216 = 0000 0100 1110 00102 Оскільки число, задане варіантом, від’ємне, то отриманий двійковий код потрібно перевести у доповняльний код: 0000 0100 1110 0010 1111 1011 0001 1101 +_______________1 1111 1011 0001 1110 = FB 1E Отже, ВПК(i2) = 1E FB. 2.1.4. Дійсний тип double d2 = 120.1e+12; Число типу double в представленні комп’ютера займає 8 байт. Для того, щоб отримати результат, дане число потрібно перевести у двійкову систему числення: d3 = 120100000000000 = 6D3AF5D66800.0 = 0110 1101 0011 1010 1111 0101 1101 0110 0110 1000 0000 0000,0000 Нормалізація: 01,10 1101 0011 1010 1111 0101 1101 0110 0110 1000 0000 0000 0000*10¹º¹¹¹º Визначення порядку: е = 1023+46 = 1069 = 42D = 100 0010 1101 Визначення знаку: s = 0(число додатне). Визначення мантиси: m = 10 1101 0011 1010 1111 0101 1101 0110 0110 1000 0000 0000 0000 00|00 Збірка за схемою: 1біт 11 біт 52 біта  s e m  0 100 0010 1101 10 1101 0011 1010 1111 0101 1101 0110 0110 1000 0000 0000 0000 00   0100 0010 1101 1011 0100 1110 1011 1101 0111 0101 1001 1010 0000 0000 0000 0000 = 42 DB 4E BD 75 9A 00 00 ВПК(d2): 00 00 9A 75 BD 4E DB 42 2.2. Завдання 2. Внутрішні формати похідних типів Визначити внутрішнє представлення в пам’яті комп’ютера даних похідних типів. 2.2.1. Представлення рядку символів в пам’яті комп’ютера. Визначити представлення в пам’яті комп’ютера рядків символів. char *string17 = "\x34\\fdg\v\n3""""\\fh2l\\v\\"""; Та виконати наступні переприсвоювання: string0[0]='3'; string0[2]='1'; string0[4]='8'; string0[6]='4'; string0[8]='7'; string0[10]='8'; string0[12]='4'; string0[14]='8'; Номер байту 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  До переприсвоєння \x34 \ f d g \v \n 3 \ f h 2 l \ v \ 0  Після переприсвоєння 3 \ 1 d 8 \v 4 3 7 f 8 2 4 \ 8 \ 0  Код ASCII 51 92 49 100 56 11 52 51 55 102 56 50 52 92 56 92 0  У 16 сч 33 5C 31 64 38 0B 34 33 37 66 38 32 34 5C 38 5C 00  ВПК(string17): 33 5C 31 64 38 0B 34 33 37 66 38 32 34 5C 38 5C 00 2.2.2. Представлення перерахувань в пам’яті комп’ютера. enum color12 { BLUE, //0, не визначено, BLUE = 0 GREEN, //1, не визначено, GREEN = BLUE+1 CYAN = 0, //0, визначено, CYAN = 0 RED, //1, не визначено, RED = CYAN+1 BROWN, //2, не визначено, BROWN = RED+1 GRAY, //3, не визначено, GRAY = BROWN+1 YELLOW = 8, //8, визначено, YELLOW = 8 WHІTE, //9, не визначено, WHІTE = YELLOW+1 MAGENTA, //10, не визначено, MAGENTA = WHІTE+1 LІGHTGRAY, //11, не визначено, LІGHTGRAY = MAGENTA+1 DARKGRAY, //12, не визначено, DARKGRAY = LІGHTGRAY+1 BLACK //13, не визначено, BLACK = DARKGRAY+1 } c1= CYAN, //00 00 00 00 c2= BROWN, //00 00 00 02 c3= DARKGRAY; //00 00 00 0С ВПК c1: 00 00 00 0016 ВПК c2: 02 00 00 0016 ВПК c3: 0С 00 00 0016 2.2.3. Представлення масивів в пам’яті комп’ютера. unsigned short array8[][2][3] = {{23,3,6}, {255}} Всім не визначеним елементам призначається по замовчуванні значення 0, Оскільки в загальній дужці є 2 незалежні дужки, то розмірність масиву array0[2][2][2]. Оскільки масив типу unsigned short, то під кожен елемент масиву буде виділятися по 2 байти. 23 3 6  0 0 0  255 0 0  0 0 0   Для кожного варіанту виконати наступні переприсвоювання: 1-ий елемент масиву = 0 * 10 = 0; 2-ий елемент масиву = 6 * 10 = 60; 3-ий елемент масиву = 3 * 10 = 30; 4-ий елемент масиву = 1 * 10 = 10; 5-ий елемент масиву = 8 * 10 = 80; 6-ий елемент масиву = 4 * 10 = 40; 7-ий елемент масиву = 7 * 10 = 70; 8-ий елемент масиву = 8 * 10 = 80; 9-ий елемент масиву = 4 * 10 = 40; 10-й елемент масиву = 8 * 10 = 80; 0 60 30  10 80 40  70 80 40  80 0 0   У 16 системі числення: 00 00 00 3С 00 1E  00 0A 00 50 00 28  00 46 00 50 00 28  00 50 00 00 00 00   Отже, ВПК16 = 00 00 3C 00 1E 00 0A 00 50 00 28 00 46 00 50 00 28 00 50 00 00 00 00 0016 2.2.4. Представлення структур в пам’яті комп’ютера. struct str0 { long d; double a; char c[5]; unsigned : 2; unsigned :5; unsigned e:3; unsigned b:3; unsigned :0; wchar_t f; }str; Для кожного варіанту виконати надання значень елементам структури : str.a = 10.12; str.b = 256432; str.c[0] = 'T'; str.c[1] = 's'; str.c[2] = 'v'; str.c[3] = 'e'; str.c[4] = 'l'; str.d = 287264; str.e = 4320; str.f = '8'; long d str.d = 287264 = 46220 Тип long ВПК займає 4 байти. ВПК(str.d): 20 62 04 00 double a str.a = 10.12 = A,1EB851EB851EB = 1010,0001 1110 1011 1000 0101 0001 1110 1011 1000 0101 1000 1110 1011 Нормалізація: 1,010 0001 1110 1011 1000 0101 0001 1110 1011 1000 0101 1000 1110 1011*10¹ Визначення порядку: 1023+3 = 1026 = 40216 Визначення знаку: s = 0(додатне); Визначення мантиси: m = 010 0001 1110 1011 1000 0101 0001 1110 1011 1000 0101 0001 1110 1|011 Збірка за схемою: 1біт 11 біт 52 біта  s e m  0 100 0000 0010 010 0001 1110 1011 1000 0101 0001 1110 1011 1000 0101 0001 1110 1  0100 0000 0010 0100 0011 1101 0111 0000 1010 0011 1101 0111 0000 1010 0011 1101 ВПК(str.a): 3D 0A D7 A3 70 3D 24 40 char c[5]; Змінна типу char займає 1 байт; виділено під масив 5 байт, але ще вирівняємо 3 байтoм до наступного слова. Поки не відбулася заповнення вхідними значеннями, ВПК має наступний вигляд: СС СС СС СС СС СС СС СС str.c[0] = 'T' = 54; str.c[1] = 's' = 73; str.c[2] = 'v' = 76; str.c[3] = 'e' = 65; str.c[4] = 'l' = 6C; Після переписвоєння отримаємо такий результат: ВПК(str.c): 54 73 76 65 6C CC CC CC unsigned : 2, unsigned :5, unsigned e:3, unsigned b:3 i unsigned :0; Під всі ці змінні буде виділено тільки 4 байти, оскільки кожна з них використовує бітове поле різної величини і всі змінні належать до одного типу unsigned int. Перші дві змінні не використовуються, але ними задане бітове поле розміром 2 і 5 відповідно, то як наслідок, молодші 7 біт ми «пропускаємо» і починаємо заповнювати дані починаючи із 8 біта; unsigned :0 участі в утворенні результату не бере. unsigned e:3; е = 4320 = 10E0 = 1 000 1110 0000 Оскільки використовується бітове поле, то значущі тільки три молодші розряди, які потім і утворять результат. unsigned b:3; b = 3E9B0 = 11 1110 1001 1011 0000 Далі буде подана таблиця, на якій показано, як утворюється результат. На першій – до пере присвоєння даний, другій – після. Біти 24-31 23-16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 10  Знач СС СС 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0   Незаповнені біти unsigned b:3 unsigned e:3 unsigned : 2, unsigned :5  ВПК: 40 C0 CC CC wchar_t f; Змінна типу wchar_t ВПК займає 2 байти. str.f = '8' = 00 38; ВПК(str.f ): 38 00 Номер байту 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  Значення 20 62 04 00 СС СС СС СС 3D 0A D7 A3 70 3D 24 40  Число long d Вирівнювання double a   Номер байту 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  Значення 54 73 76 65 6C CC CC CC 4С С0 СС СС 38 00 СС СС  Число char c[5] Вирівнювання unsigned : 2, unsigned :5, unsigned e:3, unsigned b:3 unsigned :0; wchar_t f Вирівнюваня  Отже у ВПК ця структура представлена: ВПК(str0): 20 62 04 00 СС СС СС СС 3D 0A D7 A3 70 3D 24 40 54 73 76 65 6C CC CC CC 4C C0 CC CC 38 00 CC CC 2.2.5. Представлення об'єднань в пам’яті комп’ютера. union un20 { int b; struct { char c; //1байт+7байт вирівнювання double e; //8 байт }; struct { double f; //8 байт char a[10]; //10 байт+6 байт вирівнювання 24 байт }; } un; un.e = 34220; un.c = 59000; un.a[0] = '4'; un.a[1] = '7'; un.a[2]
Антиботан аватар за замовчуванням

18.03.2015 01:03-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!