МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИНАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІНСТИТУТ КОМП’ЮТЕРНОЇ ТЕХНІКИ АВТОМАТИКИ ТА МЕТРОЛОГІЇ
Кафедра ЕОМ
КУРСОВА РОБОТА (ЧАСТИНА 1)
З ПРЕДМЕТУ: «Програмування. Частина III.
Структури даних та алгоритми»
ТЕМА: «Представлення в пам’яті комп’ютера статичних даних»
Львів – 2011
Завдання на курсову роботу
Завдання 1:
Визначити внутрішнє представлення в пам’яті комп’ютера даних базових типів. Розглянути основні прості (цілі, дійсні, символьні, логічні) типи даних:
b,ch3,i4,d1
bool b;
signed char ch3;
int i4;
float d1;
Тестування провести для наступних значень змінних:
b = (день народження * 5) % 10 * місяць народження= 85%10*7 = 35
ch3=t=116
i4=– i3=-( день народження * 215)= -(17*215) = -3655
d1 = – Z . X e – Y=-119.17e-7
Завдання 2:
Визначити внутрішнє представлення в пам’яті комп’ютера даних похідних типів.
№ варіанта = 3
Визначити представлення в пам’яті комп’ютера рядків символів.
Тестування провести для наступних значень змінних
Оголосити рядок символів і ініціалізувати його згідно наведеній нижче таблиці. Після цього виконати деякі переприсвоювання, задані після таблиці.
char *string3 = "efg\\""""\x22\2!34\4\?545\\\\\"\'f\\df";
string3 [0] = '3';
string3 [2] = '0';
string3 [4] = '3';
string3 [6] = '4';
string3 [8] = '3';
string3 [10] = '1';
string3 [12] = '6';
string3 [14] = '8';
№ варіанта = 10
Визначити представлення в пам’яті комп’ютера переліків.
Тестування провести для наступних значень змінних:
Оголосити три змінні перелікового типу і надати їм значення згідно наведеній нижче таблиці.
enum color10 {
BLUE,
GREEN,
CYAN,
RED,
BROWN,
GRAY = 1,
YELLOW,
WHІTE,
MAGENTA,
LІGHTGRAY,
DARKGRAY = -2,
BLACK
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY;
№ варіанта = 7
Визначити представлення в пам’яті комп’ютера масивів.
Тестування провести для наступних значень змінних:
Оголосити масив та ініціалізувати його згідно наведеній нижче таблиці. Після цього виконати деякі переприсвоювання, задані після таблиці.
short array7[][3][2] = {{3,45,5},{1,2,69}}
array7[0][0][0] = 0; // 0 * 17 = 0
array7[0][0][1] = 153; // 9 * 17 = 153
array7[0][1][0] = 51; // 3 * 17 = 51
array7[0][1][1] = 0; // 0 * 17 = 0
array7[0][2][0] = 51; // 3 * 17 = 51
array7[0][2][1] = 68; // 4 * 17 = 68
array7[1][0][0] = 51; // 3 * 17 = 51
array7[1][0][1] = 17; // 1 * 17 = 17
array7[1][1][0] = 102; // 6 * 17 = 102
array7[1][1][1] = 136; // 8 * 17 = 136
№ варіанта = 6
Визначити представлення в пам’яті комп’ютера структур.
Тестування провести для наступних значень змінних:
Оголосити структуру згідно наведеній нижче таблиці. Після цього надати всім елементам структури певні значення, задані після таблиці.
struct str6 {
unsigned long e:3;
unsigned long :2;
short :2;
signed short d;
unsigned :7;
double a;
short b:7;
char f;
char c[9];
}str;
str.a = 17.119;
str.b = 153 * 1 * 124 = 18972
str.c[0] = 80;
str.c[1] = 101;
str.c[2] = 116;
str.c[3] = 114;
str.c[4] = 117;
str.d = 764 * 153 * 3 = 350676;
str.e = 17 * 7 * 36 = 4284;
str.f = 8;
№ варіанта = 26
Визначити представлення в пам’яті комп’ютера об'єднань.
Тестування провести для наступних значень змінних:
Оголосити об'єднання згідно наведеній нижче таблиці. Після цього надати деяким елементам об'єднання початкові значення, задані після таблиці.
union un26 {
struct {
wchar_t a[7];
unsigned short c;
};
float e;
struct {
int b;
float f[3];
};
} un;
Для кожного варіанту виконати надання значень елементам об'єднання :
un.e = 1 * 325 + 1992 * 17 = 325+33864 = 34189;
un.c = 17 * (7 + 153) * 100 = 272000;
un.a[0] = ‘4’;
un.a[1] = ‘3’;
un.a[2] = ‘1’;
un.a[3] = ‘6’;
un.a[4] = ‘8’;
Зміст
Вступ………………………………………………………………………….
Теоретична частина………………………………………………………
Алгоритм розв’язання задачі…………………………………………….
Система тестів…………………………………………………………….
Завдання 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. Об'єднання
Результати виконання програми…………………………………………
Висновки……………………………………………………………………….
Список літератури…………………………………………………………….
Додатки………………………………………………………………................
Вступ
Термін "інформація" походить від латинського слова "informatio", що означає роз’яснення, виклад. Хоч людина постійно має справу з інформацією, але наукового визначення, що таке інформація, не існує. Тоді говорять не про визначення, а про поняття, що, в залежності від обставин, може мати різний зміст. Можна дати таке визначення інформації: інформація - сукупність відомостей про всілякі об'єкти, явища, процеси. При всьому різноманітті, інформація володіє чотирма спільними основними властивостями: інформацію можна створювати, передавати, зберігати і опрацьовувати.
Найважливішими, з практичної точки зору, властивостями інформації є цінність, достовірність та актуальність. Цінність інформації — визначається забезпеченням можливості досягнення мети, поставленої перед отримувачем інформації. Достовірність — відповідність отриманої інформації об'єктивній реальності навколишнього світу. У властивості достовірності виділяються безпомилковість та істинність даних а також адекватність. Актуальність — це міра відповідності цінності та достовірності інформації поточному часу (певному часовому періоду) .
Дані є складовою частиною інформації, що являють собою зареєстровані сигнали. Під час інформаційного процесу дані перетворюються з одного виду в інший за допомогою методів. Обробка даних містить в собі множину різних операцій. Основними операціями є:
1) збір даних - накопичення інформації з метою забезпечення достатньої повноти для прийняття рішення;
2) формалізація даних - приведення даних, що надходять із різних джерел до однакової форми;
3) фільтрація даних - усунення зайвих даних, які не потрібні для прийняття рішень;
4) сортування даних - впорядкування даних за заданою ознакою з метою зручності використання;
5) архівація даних - збереження даних у зручній та доступній формі;
6) захист даних - комплекс дій, що скеровані на запобігання втрат, відтворення та модифікації даних;
7) транспортування даних - прийом та передача даних між віддаленими користувачами інформаційного процесу. Джерело даних прийнято називати сервером, а споживача - клієнтом;
8) перетворення даних - перетворення даних з однієї форми в іншу, або з однієї структури в іншу, або зміна типу носія.
Для автоматизації роботи з даними, що відносяться до різних типів, важливо уніфікувати їх форму представлення. Для цього, як правило, використовується прийом кодування, тобто представлення даних одного типу через дані іншого типу. Універсальні засоби кодування успішно втілюються в різноманітних галузях техніки, науки та культури - математичні вирази, телеграфна азбука, морська азбука, азбука для сліпих тощо. Своя система кодування існує й в інформатиці, і називається вона двійковим кодом. Ґрунтується вона на представленні даних послідовністю двох знаків: (бітів) 0 та 1. Байт — найменша адресована одиниця пам'яті ЕОМ. Містить 8 бітів. інформації.
Теоретична частина
1.1. Класифікація типів даних
Основна мета будь-якої програми полягає в обробці даних. Дані різних типів зберігаються в пам’яті комп’ютера і обробляються по-різному. Згідно з концепцією типів даних, кожний тип даних однозначно визначає:
множину значень, які може приймати змінна заданого типу;
операції та функції, які можна застосовувати до цієї змінної;
внутрішнє представлення змінної у пам'яті комп'ютера.
Нагадаємо, що пам'ять виділяється не для типу даних, а для розміщення змінних або констант певних типів.
В мові С++ розрізняють наступні категорії типів:
базові (або прості, основні, стандартні) типи даних;
похідні (або складні, складені) типи даних.
Базові типи мають імена, які є ключовими словами мови. До базових типів відносяться: скалярні типи і порожній тип (void).
Скалярні типи діляться на цілочисельні і дійсні типи (float, double, long double). Логічний тип (bool), символьні (char, wchar_t) та цілі (short, int, long) типи даних відносяться до цілочисельних типів. Для них визначені всі операції роботи з цілими числами.
Похідні типи визначаються на основі базових типів. Похідні типи діляться на скалярні і структуровані (або агрегатні).
До скалярних похідних типів відносяться:
- переліки (enum) ;
- вказівники (ім'я_типу *);
- посилання (ім'я_типу &).
До структурованих похідних типів відносяться:
- масиви;
- структури (struct);
- об'єднання (union);
- класи (class).
В структурах, об'єднаннях і класах можуть використовуватись бітові поля.
Для явного задання діапазону можна використовувати такі специфікатори:
Специфікатори short (короткий) і long (довгий) застосовуються до цілих. У таких оголошеннях слово int можна опускати, що зазвичай й робиться. Найчастіше для представлення цілого, описаного з специфікатором short, виділяється 16 біт, із специфікатором long - 32 біта, а значенню типу int - або 16, або 32 біта.
Специфікатори signed (зі знаком) або unsigned (без знака) можна застосовувати до будь-якому цілочисельного типу. Вони вказують, як інтерпретується нульовий біт змінної, тобто, якщо зазначено ключове слово unsigned, то нульовий біт інтерпретується як частина числа, у противному випадку нульовий біт інтерпретується як знаковий. У випадку відсутності ключового слова unsigned змінна вважається знаковою.
1.2. Базові типи даних
Порожній тип
Порожній тип (void) синтаксично поводиться як базовий тип. Однак використовувати його можна тільки як частину похідного типу, оскільки об'єктів типу voіd не існує. Він використовується для того, щоб вказати, що функція не повертає ніякого значення, або як базовий тип для вказівників на об'єкти невідомого типу, наприклад:
void f() // функція f не повертає ніякого значення
void* pv; // вказівник на объект невідомого типу
Логічний тип даних
В мові C++ логічний тип (bool) характеризується двома значеннями: false (0) і true (1). На відміну від мови С++ в мові С логічний тип даних іменується Bool, але при включенні заголовочного файлу <stdbool.h> можна використовувати ключові слова bool, true, false.
В пам'яті комп'ютера змінна типу bool займає 1 байт. Логічні значення можна асоціювати зі значеннями типу int: значенню false відповідає нуль, значенню true відповідають всі інші числа.
В арифметичних і логічних виразах логічні значення перетворюються в цілі числа. Арифметичні та бітові логічні операції виконуються над перетвореними величинами. Якщо результат приводиться знову до логічного типу, то 0 перетворюється в false, а ненульове значення перетворюється в true.
Символьні типи даних
Ідентифікатором символьного типу є ключове слово char.
Символьні константи (символьні літерали) можна представляти як:
клавіатурні: '1','s','Y' – записуються як символи в одинарних лапках;
кодові: '\n','\\','\?', які використовуються для представлення деяких керуючих символів та символів-розділювачів – записуються як escape-послідовності (вони починаються з символу зворотної косої риски). Перелік кодових символьних літералів наведено в Таблиці 4.1.
Таблиця 4.1.
Назва
Кодові символьні літерали
Код
Новий рядок
\n
0A
Горизонтальна табуляція
\t
09
Забій
\b
08
Вертикальна табуляція
\v
0B
Повернення каретки
\r
0D
Прогін аркуша
\f
0C
Дзвінок
\a
07
Зворотня коса риска
\\
5C
Знак питання
\?
3F
Одиночні лапки
\'
27
Подвійні лапки
\"
22
Не дивлячись на свій зовнішній вигляд, це одиночні символи.
3) кодові числові: '\0','\x5C','\124', які використовуються для представлення будь-яких символів – записуються у вигляді однієї, двох або трьох вісімкових цифр з символом зворотної косої риски ( \ ) перед ними або довільним шістнадцятковим числом з послідовністю \х перед ним. Послідовність вісімкових або шістнадцяткових цифр закінчується першим символом, який не є відповідно вісімковою або шістнадцятковою цифрою. Приклади таких представлень наведені в Таблиці 4.2.
Таблиця 4.2.
Десяткова
Вісімкова
Шістнадцяткова
Символ
7
'\7'
'\x7'
Дзвінок
48
'\60'
'\x30'
'0'
50
'\062'
'\x32'
'2'
95
'\137'
'\x005f'
'_'
Значеннями змінних типу char є множина символів таблиці ASCII (American Standard Code For Information Interchange – американський стандартний код для обміну інформацією). Таблиця кодів ASCІІ містить 256 символів, кожний з яких має строго визначене місце і свій порядковий номер від 0 до 255. Код символу - це його порядковий номер у таблиці символів ASCІІ.
Таблиця кодів ASCІІ складається з 2 таблиць:
1. Основної ( з кодами від 0 до 127). Вона містить у собі:
- символи керування,
- символи арифметичних операцій, розділові знаки, цифри,
- букви латинського алфавіту (прописні, рядкові).
2. Розширеної ( з кодами від 128 до 255). Вона містить у собі:
- символи псевдографіки (символи, що застосовуються для побудови найпростіших фігур),
- букви національних алфавітів,
- математичні символи.
Всі символи, крім символів керування, є графічними. Вони на пристроях зображення відображаються, а в таблиці кодів ASCІІ мають графічне зображення.
Символи з кодами від 0 до 31 і код 127 відносяться до керуючих. В текстовому режимі їм відповідають графічні зображення. При використанні цих символів або кодів в операціях виведення вони набувають самостійного значення.
Перша основна половина символів таблиці ASCII (коди 0...127) побудована по стандарту ASCІІ і вона є однаковою на всіх ІBM-сумісних комп’ютерах. Принцип послідовного кодування алфавіту полягає в тому, що в кодовій таблиці ASCII латинські букви (прописні та строчні) розташовуються в алфавітному порядку. Розташування цифр також впорядковано по зростанню їх значень.
Друга половина символів (коди 128...255) може відрізнятися на комп’ютерах різного типу. У стандартному знакогенераторі фірми ІBM символи псевдографіки займають позиції з кодами від 176 до 223. Позиції з кодами від 128 до 175 і від 224 до 239 використовуються для розміщення деяких символів національних алфавітів різних європейських мов, а позиції з кодами від 240 до 255 - для розміщення спеціальних знаків. З врахуванням цього розташування символів розробляється переважна більшість програм закордонного походження.
В пам’яті комп’ютера дані символьного типу зазвичай займають 1 байт. В цей байт записується порядковий номер символа в таблиці ASCII.
Оскільки значенню типу char відводиться 8 бітів, то значення типу unsigned char має значення в діапазоні від 0 до 255, a signed char – від -128 до 127, але тільки величини від 0 до 127 мають символьний еквівалент. Чи є значення типу просто char знаковим чи беззнаковим, залежить від реалізації, але в будь-якому випадку коди друкованих символів завжди є додатніми. Далі будемо вважати, що тип char є знаковим.
Таблиця 4.5
Тип
Розмір пам'яті в байтах 16 (32)
Діапазон значень
[signed] char
1 (1)
-128..127
unsigned char
1 (1)
0..255
Цілочисельні типи даних
Типи 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
Внутрішнє представлення змінної цілого типу — ціле число у двійковому коді. Згідно формату IEEE всі додатні цілі числа зберігаються в пам'яті комп'ютера в прямому коді, а всі від'ємні – в доповняльному коді. Цілі числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
Дійсні типи даних
Дійсні константи записуються у двох формах – з фіксованою десятковою крапкою або в експонентному виді. В першому випадку крапка використовується для поділу цілої і дробової частин константи. Як ціла, так і дробова частини можуть бути відсутніми (наприклад 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.
Дійсні числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
* Розмір типу long double для різних компіляторів може відрізнятися, наприклад для BCB 6.0 буде займати 10 байт, для VC++ 6.0 буде займати 8 байт (в цьому випадку формат збереження типу long double співпадає з форматом типу double).
Масиви
Масив - це впорядкований скінченний набір даних одного типу, які зберігаються в послідовно розташованих комірках оперативної пам'яті і мають спільну назву. З оголошення масиву компілятор одержує інформацію про тип елементів масиву та їх кількість.
Якщо початкових значень меньше, ніж елементів в масиві, то елементам, що залишились автоматично надаються нульові початкові значення. Наприклад, елементам масиву 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 елементів.
Багатовимірні масиви компілятор розглядає як послідовність одновимірних, тому до елементів такого масиву, як і для одновимірних, можна також звертатись через вказівники.
В пам'яті комп'ютера елементи масиву з першого до останнього запам'ятовуються в послідовних зростаючих комірках пам'яті. Між елементами масиву в пам'яті розриви відсутні. Елементи масиву з найменшим індексом зберігаються по найменшій адресі пам’яті.
Багатовимірні масиви в пам'яті комп'ютера зберігаються так, що найбільш правий індекс збільшується першим.
Структури
На відміну від масиву, всі елементи якого однотипні, структура може містити елементи різних типів. В мові C++ структура є видом класу і має всі його властивості, але в багатьох випадках доситатньо використовувати структури так, як вони визначені в мові С:
struct [ім'я_типу] {
тип_1 елемент _1:
тип_2 елемент _2;
тип_n елемент _n;
} [ список_оголошень ];
Елементи структури називаються полями структури і можуть мати будь-які типи, крім типу цієї ж структури, але можуть бути вказівниками на неї. Якщо відсутнє ім'я типу, то повинен бути заданий список оголошень перемінних, вказівників або масивів. В цьому випадку опис структури служить визначенням елементів цього списку, наприклад:
struct {
char fіo[30];
int date, code;
double salary;
} clerk, staff[100], *people; // визначення змінної типу структура, масиву
// структур і вказівника на структуру
Об'єднання
Об'єднання дуже схожі на структури. Однак на відміну від структури об'єднання зберігає значення тільки одного елемента в кожний момент часу. Інакше кажучи, коли виконується операція присвоювання значення елементу об'єднання, то перезаписується будь-яке попереднє присвоювання.
Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найбільш довгого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити зайву пам'ять, що не використовується. Всі елементи об'єднання зберігаються в одній і тій cамій області пам'яті, починаючи з однієї адреси.
Алгоритм розв’язання задачі.
Рішення задачі проводимо за допомогою шаблону функції, що дає змогу працювати з усіма стандартними типами даних. В функції оголошуємо вказівник на змінну типу “unsigned char” і присвоюємо їй адресу змінної, яку необхідно прочитати:
unsigned char *b_1 = (unsigned char *)(&b); // назва вказівника змінюється
// відповідно до змінних, адре-
// су яких треба прочитати
Функція приймає певне значення і виводить у консоль внутрішнє представлення даних у пам’яті комп’ютера, для цього побайтно зчитуємо дані з пам’яті і виводимо їх в шіснадцятковій системі численя.
В головній програмі оголошуємо необхідні змінні і виводимо результати роботи програми.
Система тестів
Завдання 1: Внутрішні формати базових типів
3.1.1. Логічний тип
Тестування проводимо для наступного значення змінної: b = 35
Змінна типу bool займає в пам’яті комп’ютера 1 біт і коли змінна приймає значення відмінне від 0, то ВПК записується «1», а якщо 0, то ВПК 0.
Оскільки b = 35, то
ВПК (b) – 01.
3.1.2. Символьний тип
ch3 = ‘t’;
Змінна типу char займає в пам’яті комп’ютера 1 байт. ASCII код маленької латинської літери «t» – 11610. Для отримання значення змінної ВПК, необхідно перевести це число до шістнадцяткової, а потім до двійкової систем числення:
11610 = 7416 = 0111 01002
До двійкової системи числення ми приводимо для того, щоб переконатись чи не потрібно перетворювати число у доповняльний код. Оскільки char займає 1 байт, то «перевертання» числа побайтно не впливає на його зміст. Отже,
ВПК (ch3) – 0111 0100 в двійковії СЧ, або 74 в шістнадцятковій СЧ.
3.1.3. Цілий тип
i4 = -3655
Змінна типу int займає в пам’яті комп’ютера 4 байти. Для того, щоб визначити внутрішнє представлення в пам’яті комп’ютера цього числа, його спочатку треба перевести у шістнадцяткову СЧ, а потім у двійкову СЧ:
-365510 = -Е4716 = -1110 0100 01112
Доповнимо це число зліва нулями до 4 байт (32 біт/32 розряди):
0000 0000 0000 0000 0000 1110 0100 0111.
Так, як число від’эмне, то його потрібно перетворити у доповняльний код:
0000 0000 0000 0000 0000 1110 0100 0111
1111 1111 1111 1111 1111 0001 1011 1000
+
1
______________________________________
1111 1111 1111 1111 1111 0001 1011 1001
Тепер для отримання значення числа ВПК, необхідно обернути його побайтно, бо ВПК цілі числа зберігаються у зворотньому порядку розміщення байт числа:
1111 1111 1111 1111 1111 0001 1011 1001 - до обертання
1 байт 2 байт 3 байт 4 байт
1011 1001 1111 0001 1111 1111 1111 1111 - після обертання
1 байт 2 байт 3 байт 4 байт
Отже, ВПК (i4) – 1011 1001 1111 0001 1111 1111 1111 1111 у 2 СЧ, або В9 F1 FF FF у 16 СЧ.
3.1.4. Дійсний тип
d1 = -119.17e-7
-119.17е-710=-119.17*10-710=0.00001191710
Переведення числа у 16-у та 2-у СЧ:
0.000011917*16 = 0.000190672
0.000190672*16 = 0.003050752
0.003050752*16 = 0.048812032
0.048812032*16 = 0.780992512
0.780992512*16 = 12.495880192
0.495880192*16 = 7.934083072
7.934083072*16 = 14.945329152
0.945329152*16 = 15.125266432
0.125266432*16 = 2.004262912
0.004262912*16 = 0.068206592
0.068206592*16 = 1.091305472
Отже,
0.00001191710 = 0.0000С7ЕF20116 = 0000. 0000 0000 0000 0000 1100 0111 1110 1111 0010 0000 00012
Необхідно визначити значення m (мантиса), s(знак) та e(експонента).
s = 1, бо число від’ємне.
Нормалізація:
переносимо кому на 17 розрядів вправо.
Експонента буде дорівнювати:
е=12710-1710=11010=6Е16=0110 11102
Мантиса набуде такого значення:
m=100 0111 1110 1111 0010 0000
Тип float займає в пам’яті комп’ютера займає 4 байти. Отже, число буде мати такий вигляд у двійковій системі числення:
s
e
m
1
0110 1110
100 0111 1110 1111 0010 0000
В 16-ій системі:
B7 47 EF 20.
В пам’яті комп’ютера тип float представляється в оберненому вигляді. Отже:
ВПК (d1) – 0000 0010 1111 1110 0111 0100 0111 01102 = 20 EF 47 B716
Завдання 2: Внутрішні формати похідних типів
3.2.1. Рядок символів
char *string3 = "efg\\""""\x22\2!34\4\?545\\\\\"\'f\\df";
«Розберемо» цей рядок:
"e f g \\ """" \x22 \2 ! 3 4 \4 \? 5 4 5 \\ \\ \" \' f \\ d f"
‘e’ ‘f’ ‘g’ ‘\’ ‘ у 16-ій СЧ у 8-ій СЧ ‘!’ ‘3’ ‘4’ у 8-ій СЧ ‘?’ ‘5’ ‘4’ ‘5’ ‘\’ ‘\’ ‘ “ ‘ ‘ ‘ ‘ ‘f’ ‘\’ ‘d’ ‘f’
X
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
String3[X]
e
f
g
\
“
☻
!
3
4
♦
?
5
4
5
\
\
“
‘
f
\
d
f
У 16-ій СЧ
65
66
67
5C
22
02
21
33
34
04
3F
35
34
35
5C
5C
22
27
66
5C
64
66
Виконуємо наступні переприсвоюння:
string3 [0] = '3';
string3 [2] = '0';
string3 [4] = '3';
string3 [6] = '4';
string3 [8] = '3';
string3 [10] = '1';
string3 [12] = '6';
string3 [14] = '8';
X
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
String3[X]
3
f
0
\
3
☻
4
3
3
♦
1
5
6
5
8
\
“
‘
f
\
d
f
У 16-ій СЧ
33
66
30
5C
33
02
34
33
33
04
31
35
36
35
38
5C
22
27
66
5C
64
66
В результаті рядок символів набуде такого вигляду:
char *string3 = "3f0\3☻433♦15658\”’f\df”;
Переведем у 16 СЧ (значення рядка):
довжина рядка – 22 байт.
ВПК string3: 33 66 30 5C 33 02 34 33 33 04 31 35 36 35 38 5C 22 27 66 5C 64 66 00
3.2.2. Перерахування
enum color10 {
BLUE, // 0, бо не визначено (немає присвоєння значення змінній
// BLUE)
GREEN, // 1, (оскільки