Автор: Пользователь скрыл имя, 24 Мая 2013 в 21:41, курсовая работа
Виконуючи цю курсову роботу автор повторив, як визначити внутрішнє представлення цілих, дійсних, логічних та символьних чисел в пам’яті комп’ютера. Також вивчив багато нового про представлення в пам’яті комп’ютера рядків символів, перерахувань, масивів, структур та об’єднань.
Вказівник на функцю має тип "вказівник функції, що повертає значення заданого типу і має аргументи заданого типу":
тип (*ім'я) ( список_типів_аргументів );
Наприклад, оголошення і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]
00000000 00000000 00000000 00000010 00000000 00000000 00000000 00000001 00000000
mass [1][0]
00000000 00000000 00000011 00000000 00000000 00000000
mass [2][0]
Структура. На відміну від масиву, всі елементи якого однотипні, структура може містити елементи різних типів. В мові C++ структура є видом класу і має всі його властивості, але в багатьох випадках доситатньо використовувати структури так, як вони визначені в мові С:
struct [ім'я_типу] {
тип_1 елемент _1:
тип_2 елемент _2;
тип_n елемент _n;
} [ список_оголошень ];
Елементом структури може бути бітове поле, що забезпечує доступ до окремих бітів пам'яті. Поза структурами бітові поля використовувати не можна.
Бітові поля - це особливий вид полів структури. Вони використовуються для щільного упакування даних, наприклад, прапорців типу "так/ні". Найменьша по довжині комірка пам'яті, яку можна адресувати - 1 байт, а для збереження прапорця досить одного біта.
При описі бітового поля після імені через двокрапку вказується довжина поля в бітах, що задається цілим виразом або константою. Поле нульової довжини означає вирівнювання на границю наступного слова.
Допускаються неіменовані поля бітів. Вони не впливають на зміст іменованих полів, але певним чином можуть поліпшувати розміщення полів в пам'яті.
Структури бітових полів можуть містити і знакові елементи. Але, навіть цілі поля можуть розглядатись як беззнакові. Тому рекомендується описувати бітові поля як unsіgned.
В пам'яті бітові поля розміщуються на відповідних границях слів, при цьому деякі біти слів можуть залишатись невикористаними. Поле, яке не можна розмістити у місце, що залишилося до границі слова, розміщується в наступне слово. Поле не може бути ширшим за слово. На деяких машинах бітові поля розміщуються справа наліво, а на деяких – зліва направо.
Об'єднання дуже схожі на структури. Однак на відміну від структури об'єднання зберігає значення тільки одного елемента в кожний момент часу. Інакше кажучи, коли виконується операція присвоювання значення елементу об'єднання, то перезаписується будь-яке попереднє присвоювання.
Головною особливістю об'
2.1. Завдання 1. Внутрішні формати базових типів
Визначити внутрішнє представлення в пам’яті комп’ютера даних базових типів. Розглянути основні прості (цілі, дійсні, символьні, логічні) типи даних:
bool b = 1;
char ch1 = ‘G’ = 7110;
unsigned short i1 =2625;
float d1 = -105.21e-5;
2.1.1. Логічний тип
bool b = 1;
Для представлення змінної типу bool достатньо всого 1 біта, але у пам’яті комп’ютера на змінну типу bool виділяється 1 байт, отже оскільки b = 1,
то ВПК (b) – 0116
2.1.2. Символьний тип
char ch1 = ‘G’ = 7110;
Змінна типу char займає в пам’яті комп’ютера 1 байт. ASCII код латинської літери ‘G’ – 7110. Для отримання значення змінної ВПК, необхідно перевести це число до двійкової системи числення.
7110 = 4716 = 0100 01112.
Отже, ВПК (ch2) - 0100 01112, або 4716
2.1.3. Цілий тип
unsigned short i1 =2625;
Змінна типу unsigned short займає в пам’яті комп’ютера 2 байти. Для того, щоб визначити внутрішнє представлення в пам’яті комп’ютера цього числа, його спочатку треба перевести у двійкову систему числення, оскільки додатні цілі числа зберігаються у прямому двійковому коді.
262510 = A4116 = 1010 0100 00012.
Доповнимо це число зліва нулями до 2 байт:
0000 1010 0100 00012= 0A 4116
Для отримання значення числа ВПК, необхідно обернути його побайтно, бо ВПК цілі числа зберігаються у зворотньому порядку розміщення байт числа:
ВПК: 41 0A16
2.1.4. Дійсний тип
float d1 = -105.21e-5 = -105.21 * 105 = -10 521 000;
Переведем число у 16 та 2 СЧ:
1052100010 = A089A816 = 1010 0000 1000 1001 1010 10002
Тип float займає ВПК 4 байт (32 біт)
З них 8 біт виділяється під експоненту, 1 біт під знак числа і решта 23 під мантису.
Необхідно визначити значення m (мантиса), s(знак) та e(експонента).
s = 1, бо число відємне.
1010 0000 1000 1001 1010 1000.02
Нормалізуємо число:
1. 010 0000 1000 1001 1010 10002 * 1010000
Знайдемо експоненту е = 12710 + 2310 = 15010 = 9616 = 1001 01102
Знайдемо мантису m:
m = 1. 010 0000 1000 1001 1010 1000
Зборка за схемою:
1біт |
8 біт |
23 біта |
s |
e |
m |
1 |
1001 0110 |
010 0000 1000 1001 1010 1000 |
1100 1011 0010 0000 1000 1001 1010 10002=CB 20 89 A816
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно, бо ВПК числа типу float у зворотньому порядку розміщення байт числа.
Отже, ВПК (d1)- A8 89 20 CB16
2.2. Завдання 2. Внутрішні формати похідних типів
Визначити внутрішнє представлення в пам’яті комп’ютера даних похідних типів.
2.2.1. Представлення рядку символів в пам’яті комп’ютера.
char *string26 = "\x22\33\x4\\vv\\\\bnn\n57!\\
Приберемо не значимі символи "
char *string26 = \x22\33\x4\\vv\\\\bnn\n57!\\n
Виконуємо наступні переприсвоєння:
string26[00] = ‘6’;
string26 [02] = ‘6’;
string26 [04] = ‘0’;
string26 [06] = ‘5’;
string26 [08] = ‘3’;
string26 [10] = ‘2’;
string26 [12] = ‘5’;
string26 [14] = ‘9’;
Номер байту |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
До переприсвоєння |
\x22 |
\33 |
\x4 |
\\ |
v |
v |
\\ |
\\ |
b |
n |
n |
Після переприсвоєння |
6 |
\33 |
6 |
\\ |
0 |
v |
5 |
\\ |
3 |
n |
2 |
Код ASCII |
54 |
← |
54 |
92 |
48 |
118 |
53 |
92 |
51 |
53 |
50 |
У 16 сч |
36 |
1B |
36 |
5C |
30 |
76 |
35 |
5C |
33 |
6E |
32 |
Номер байту |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
До переприсвоєння |
\n |
5 |
7 |
! |
\\ |
n |
\0 |
Після переприсвоєння |
\n |
5 |
7 |
9 |
\\ |
n |
\0 |
Код ASCII |
LF |
53 |
55 |
57 |
53 |
110 |
NUL |
У 16 сч |
0A |
35 |
37 |
39 |
5C |
6E |
00 |
Информация о работе Представлення статичних данних в пам’яті комп’ютера