МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
"Представлення в пам’яті комп’ютера
даних цілих та дійсних типів"
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи № 1
з дисципліни
" Програмування. Частина III.
Структури даних та алгоритми "
для студентів напряму
6.050102 “Комп’ютерна інженерія”
Львів – 2010
Методичні вказівки до лабораторної роботи "Представлення в пам’яті комп’ютера цілих та дійсних типів даних" з дисципліни “Програмування. Частина IIІ. Структури даних та алгоритми" для підготовки студентів напряму 6.050102 “Комп’ютерна інженерія” / Укл. Т.А. Матвейчук – Львів: Видавництво НУ “Львівська політехніка”, 2010 – 11 с.
Укладач: Матвейчук Т.А., ст. викладач каф.ЕОМ
Відповідальний
за випуск: Мельник А.О., д-р техн. наук, проф.
Рецензенти: Мороз І.В., ст. викладач каф.ЕОМ
Юрчак І.Ю., доцент кафедри САПР, к.т.н.
1. МЕТА РОБОТИ
Дослідження внутрішнього представлення в пам’яті комп’ютера (ВПК) статичних даних базових типів.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. Класифікація типів даних
Основні об'єкти, з якими працює програма на мові С++ - змінні і константи. Змінні - поіменновані величини, значення яких, на відміну від констант, можуть змінюватись в процесі виконання програми. Всі змінні повинні бути описані. В описах вказуються їх типи і, можливо, початкові значення. Константами називаються перерахування величин у програмі. Розрізняють чотири типи констант: цілі константи, константи з плаваючою комою, символьні константи і строкові літерали.
Під типом даних розуміють множину допустимих значень цих даних і множину дозволених операцій над ними. Водночас тип даних визначає і розмір пам'яті, що займають змінні або константи даного типу. Пам'ять не виділяється для типу даних, а виділяється для розміщення змінної або константи заданого типу.
У мові С++ виділяють наступні категорії типів даних:
базові типи;
похідні типи.
Базові типи мають імена, які є ключовими словами мови.
До базових типів належать: скалярні типи і порожній тип (void).
Тип void не має значення і введений для опису функцій, які не повертають значень, та для деяких інших цілей.
Базові типи поділяються на цілочисельні та дійсні типи.
Логічний тип, символьний тип і цілий тип є цілочисельними типами даних, для яких визначені всі операції з цілими числами.
Похідні типи визначаються на основі базових типів. Похідні типи поділяються на скалярні і структурні (агрегатні).
До скалярних похідних типів належать:
- перерахування (enum) — множина поіменованих цілих значень,
- вказівники (*),
- посилання (&).
До структурних похідних типів належать:
- масиви (ім'я_масиву[кількість_елементів]),
- структури (struct),
- об'єднання (union),
- класи (class).
2.2. Цілочисельні типи даних
Типи 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. Перелік типів наведено в Таблиці 1.
Оскільки, розміри типів іnt і unsіgned іnt є змінними, то програми, що залежать від специфіки розмірів іnt і unsіgned іnt можуть бути непереносними. Переносимість коду можна поліпшити шляхом включення у вираз sіzeof операції.
Таблиця 1
Тип
Розмір пам'яті
в байтах 16 (32)
Діапазон значень
[signed] short [int]
2
-215 .. 215-1 = -32768 .. 32767
unsigned short [int]
2
0 .. 216-1 = 0 .. 65535
[signed] int
2 (4)
-215 .. 215-1 (-231 .. 231-1)
unsigned [int]
2 (4)
0 .. 216-1 (0 .. 232-1)
[signed] long [int]
4
-231 .. 231-1 = -2 147 483 648 .. 2 147 483 647
unsigned long [int]
4
0 .. 232-1 = 0 .. 4 294 967 295
Літерали цілих типів можна записати в десятковому, вісімковому або шістнадцятковому представленнях, наприклад: 20 (десяткове), 024 (вісімкове), 0х14 (шістнадцяткове). Якщо літерал починається з 0, він трактується як вісімковий, якщо з 0х або 0Х, то як шістнадцятковий. Звичний запис розглядається як десяткове число. За замовчуванням всі цілі літерали мають тип sіgned іnt.
Можна явно визначити цілий літерал, що має тип long, приписавши в кінці числа букву L (використається як прописна L, так і рядкова l, однак для зручності читання не слід вживати рядкову - її легко переплутати з 1). Буква U (або u) в кінці числа визначає літерал як unsіgned іnt, а дві букви – UL або LU – як тип unsіgned long. Наприклад: 25u, 1015UL, 2L, 7Lu
Записи вісімкової і шістнадцяткової констант можуть завершуватися буквою L (для вказівки на тип long) і U (якщо потрібно показати, що константа беззнакова). Наприклад, константа 0XFUL має значення F16 = 1510 і тип unsigned long.
Внутрішнє представлення змінної цілого типу — ціле число у двійковому коді. Згідно формату IEEE всі додатні цілі числа зберігаються в пам'яті комп'ютера в прямому коді, а всі від'ємні – в доповняльному коді. Всі цілі числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
Приклад 1
Додатнє число 25 типу int в пам'яті комп’ютера зберігається в прямому двійковому коді і займає 4 байти: 0000 0000 0000 0000 0000 0000 0001 1001
В пам’яті комп’ютера цілі числа зберігаються у зворотному порядку розміщення байт числа:
0001 10001 0000 0000 0000 0000 0000 0000
Результат в 16-ковій системі числення: 19 00 00 00.
Приклад 2.
Від'ємне число -3500 типу long int в пам'яті комп’ютера зберігається в доповняльному двійковому коді і займає 4 байти: - 350010 = - DAC16 = - 1101 1010 11002
0000 0000 0000 0000 0000 1101 1010 1100 - прямий код;
1111 1111 1111 1111 1111 0010 0101 0011 - обернений код;
+ 1
1111 1111 1111 1111 1111 0010 0101 0100 - доповняльний код;
F F F F F 2 5 4 - в 16- ковій системі числення
В пам’яті комп’ютера зберігається у зворотному порядку розміщення байт числа:
0101 0100 1111 0010 1111 1111 1111 1111
Результат в 16- ковій системі числення: 54 F2 FF FF.
У наведеній нижче програмі показано приклад дослідження представлення в пам'яті комп'ютера цілочисельної змінної х, якій надано значення 1 :
#include<stdio.h>
#include<conio.h>
void main (void){
int x=1;
unsigned char *vx=(unsigned char *)(&x);
for (int i=0;i<sizeof(x);i++)
printf("%02X ",vx[i]);
getch();
}
2.3. Дійсні типи даних
Дійсні константи записуються у двох формах – з фіксованою десятковою крапкою або в експоненціальному вигляді. В першому випадку крапка використовується для поділу цілої і дробової частин константи. Як ціла, так і дробова частини можуть бути відсутніми. Наприклад: 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 може бути відсутній)
Перелік типів наведено в Таблиці 2.
Константи з рухомою комою мають за замовчуванням тип double. Саме він є найбільш природнім для комп'ютера. У програмуванні треба по можливості уникати типу float, тому що його точність недостатня, а процесор однаково при виконанні операцій перетворить його в тип double. Один з випадків, де застосування типу float виправдане – тривимірна комп'ютерна графіка.
Можна явно вказати тип константи за допомогою букв F, f (float) і L, l (long). Наприклад, константа 3E3L буде мати значення 3000 і тип 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. Таким чином, максимальний по модулю від'ємний порядок представляється нульовим кодом.
Дійсні числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
Таблиця 2
Назва
типу
Іденти-фікатор
Діапазон значень
Внутрішній формат:
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)*
* Розмір типу long double для різних компіляторів може відрізнятися, наприклад для BCB 6.0 буде займати 10 байт, для VC++ 6.0 буде займати 8 байт (в цьому випадку формат збереження типу long double співпадає з форматом типу double).
Приклад 3.
Розглянемо, як в пам'яті комп’ютера зберігається додатнє число 649,1989 типу float .
Перевід цілої частини:
=> 649 10 = 289 16
Перевід дробової частини:
0, 1989 * 16 = 3,1824
0, 1824 * 16 = 2,9184
0, 9184 * 16 = 14,6944 (1410 = E16)
0, 6944 * 16 = 11,1104 (1110 = B16)
=> 0,1989 10 = 0,32EB 16
Отже: 649,1989 10 = 289,32EB 16 = 0010 1000 1001 , 0011 0010 1110 1011 2
Нормалізація: 001 , 0 1000 1001 0011 0010 1110 1011 2 * 101001
Заокруглення:
1 , 0 1000 1001 0011 0010 1110 10│11
+ 1
1 , 0 1000 1001 0011 0010 1110 11
Визначення мантиси: m=0 1000 1001 0011 0010 1110 11
Визначення зміщеного порядку: е = 12710 + 910 = 136 10 = 88 16 = 1000 0101 2
Інший спосіб: 12710 = 111 1111 2
+ 1001
1000 1000 2
Визначення знакового розряду: s=0 (бо число додатнє).
Схема внутрішнього представлення:
s
e
m
1 біт
8 біт
23 біт
Зборка за схемою:
s
e
m
0
1000 1000
0 1000 1001 0011 0010 1110 11
В 16- ковій системі числення: 0100 0100 0010 0010 0100 1100 1011 1011 2= 44 22 4С BB 16
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа:
1011 1011 0100 1100 0010 0010 0100 0100
Результат в 16- ковій системі числення: BB 4С 22 44
Приклад 4.
Розглянемо, як в пам'яті комп’ютера зберігається від'ємне число – 649,1989 типу float .
Різниця з попереднім прикладом буде полягати тільки у представленні знакового розряду.
Визначення знакового розряду: s=1 (бо число від'ємне).
Зборка за схемою (відміну від попереднього прикладу будемо виділяти жирним шріфтом):
s
e
m
1
1000 1000
0 1000 1001 0011 0010 1110 11
В 16- ковій системі числення: 1100 0100 0010 0010 0100 1100 1011 10112 = С4 22 4С BB 16
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа:
1011 1011 0100 1100 0010 0010 1100 0100
Результат в 16- ковій системі числення: BB 4С 22 С4
У наведеній нижче програмі показано приклад дослідження представлення в пам'яті комп'ютера дійсної змінної х типу float, ініціалізованної значенням 1 :
#include<stdio.h>
#include<conio.h>
void main (void){
float x=1.;
unsigned char *vx=(unsigned char *)(&x);
for (int i=0;i<sizeof(x);i++)
printf("%02X ",vx[i]);
getch();
}
3. ПОРЯДОК ВИКОНАННЯ РОБОТИ
1. При підготовці до лабораторної роботи, необхідно засвоїти теоретичний матеріал по темі і підготуватись до контрольного опитування по розумінню питань даної тематики.
2. Згідно з індивідуальним завданням розробити алгоритм розв’язання задачі.
3. Підготувати програмну реалізацію розробленого алгоритму. Засобами вбудованого тексто-вого редактора інтегрованого середовища набрати текст підготовленої програми. Відкомпілювати, налагодити та виконати програму.
4. Протестувати програму згідно зі складеною системою тестів і, при потребі, відкоректувати текст програми. Проаналізувати отримані результати.
5. Написати контрольне опитування по темі.
6. Оформити звіт по роботі.
Без підготовкі до лабораторної роботи (програмної реалізації розробленого алгоритму) студент до роботи не допускається.
4. ЗАВДАННЯ НА ЛАБОРАТОРНУ РОБОТУ
І. Дослідити внутрішнє представлення в пам’яті комп’ютера даних цілих та дійсних типів.
Розглянути наступні базові типи даних:
int i1 , і2;
float f1 , f2;
ІІ. Провести тестування для заданих значень змінних.
Для надання значень змінним використати одну з літер Прізвища.
Далі використовувати такі позначення:
Рr1 - ASCII–код першої літери прізвища (латинська велика літера),
рr2 - ASCII–код другої літери прізвища (латинська мала літера),
рr3 - ASCII–код третьої літери прізвища (латинська мала літера).
Ініціалізувати оголошенні змінні наступними значеннями:
i1 = Рr1;
i2 = i1 * (–5);
f1 = рr2 . рr3;
f2 = f1*(–3);
5. ВИМОГИ ДО ОФОРМЛЕННЯ ЗВІТУ
I. Оформити титульну сторінку звіту стандартного зразка, на якій обов’язково вказати номер лабораторної роботи, її назву та вибір варіанту. Зразок оформлення титульної сторінки лабораторної роботи наведено в Додатку А.
II. В звіті мають бути відображені наступні пункти:
Мета роботи
Постановка задачі
Система тестів
Представлення ВПК змінної і1
Представлення ВПК змінної і2
Представлення ВПК змінної f1
Представлення ВПК змінної f2
Алгоритм розв’язання задачі
Результати виконання програми
Висновки
Додатки
IIІ. Змістовне наповнення пунктів:
Постановка задачі має містити індивідуальне завдання зі своїми конкретними значеннями.
В пункті система тестів наводяться основні ручні розрахунки по представленню в пам’яті комп’ютера відповідних змінних.
В пункті алгоритм розв’язання задачі надається словесний опис основних прийомів, що застосовуються для розв’язання задачі.
Результати виконання програми мають містити роздруковані копії екранів з результатами.
В додатках розміщуються тексти програм з коментарями.
6. КОНТРОЛЬНІ ЗАВДАННЯ
1. Перевести задані числа в інші системи числення:
2-ва система числення
8-ва система числ.
10-ва система числ.
16-ва система числ.
1110000
?
?
?
?
-372
?
?
?
?
670,85
?
?
?
?
72
2. Знайти внутрішні представлення ВПК цілих та дійсних типів даних:
Тип
даних
Значення
Розміщення в пам’яті комп’ютера
1-ий байт
2-ий байт
3-ій байт
4-ий байт
int
-14810 = -9416
?
?
?
?
float
2670,0510 = A6E,0(C)16
?
?
?
?
СПИСОК ЛІТЕРАТУРИ
Грегори К. Использование Visual С++. Специальное издание. - М.: «Диалектика», 1999.
Мешков А.В., Тихомиров Ю.В. Visual С++ и MFC. Пер. с англ. – 2-е изд. перераб. и доп. – СПб.: БХВ - Петербург, 2002. – 1040 с.
Страуструп Б. Язык программирования С++. Третье издание. - М.: «Издательство Бином», 1999.
Трамбле Ж., Соренсон П. Введение в структуры данных. – М.:Машиностроение, 1982
Уильям Топп, Уильям Форд. Структуры данных в С++. – М.:Бином, 2000 - 700 с
ЗМІСТ
Мета роботи……………………………………..………………………………………..… 3
Теоретичні відомості..........….…………………………………………………………...… 3
Порядок виконання роботи..............………………………………………..……..…….… 7
Завдання на лабораторну роботу ....………………………………………..……..…….… 8
Вимоги до оформлення звіту.......................……...……..……………………………….... 8
Контрольні завдання................………..…………………………………………………… 8
Список літератури ………...……….....................……………………………………….… 9
Додаток А………...……….....................……………..............………………………….… 11
Додаток А
Міністерство освіти і науки, молоді та спорту України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи № 1
на тему:
"Представлення в пам’яті комп’ютера
даних цілих та дійсних типів"
з дисципліни:
" Програмування. Частина III. Структури даних та алгоритми "
Вибір індивідуального завдання:
i1 = Рr1 = №(G) = 71
i2 = i1 * (–5) = –355
f1 = рr2 . рr3 = №(r) . №(o) = 114 . 111
f2 = f1*(–3) = –342 . 333
Виконав:
ст. гр. КІ-21
Громов Б.М.
Перевірив:
ст. викл. каф.ЕОМ
Матвейчук Т.А.
Львів – 2012
НАВЧАЛЬНЕ ВИДАННЯ
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи
"Представлення в пам’яті комп’ютера даних цілих та дійсних типів"
з дисципліни
“Програмування. Частина IIІ. Структури даних та алгоритми"
для підготовки студентів напряму
6.050102 “Комп’ютерна інженерія
Укладач Т.А.Матвейчук, ст. викладач каф.ЕОМ
Редактор
Комп’ютерне складання
Підписано до друку 2011 р.
Формат 70 х 100 1/16. Папір офсетний.
Друк на різографі. Умовн. друк. арк. ...... Обл.-вид. арк. ......
Наклад ..... прим. Зам.
Поліграфічний центр
Видавництва Національного університету “Львівська політехніка”
вул. Колесси, 2, 79000, Львів