Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №1
з дисципліни: "Програмування. Частина III. Структури даних та алгоритми"
Тема: "Подання в пам’яті комп’ютера статичних даних базових типів"
Львів
2016
МЕТА РОБОТИ
Дослідження внутрішнього подання в пам’яті комп’ютера базових типів даних статичної структури.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Охарактеризуємо типи даних мови С++, які відіграють важливу роль в обробці даних. Під типом даних розуміють множину припустимих значень цих даних і множину дозволених операцій над ними. Водночас тип даних визначає і розмір пам'яті, що займають змінні і константи даного типу. Кожен тип даних має ім'я (ідентифікатор). Пам'ять не виділяється для типу даних, а виділяється для розміщення змінної або константи.
У мові С++ виділяють наступні категорії типів:
базові типи даних;
похідні типи.
Базові типи мають імена, які є ключовими словами мови.
До базових типів належать: скалярні типи і порожній тип — void.
Тип void не має значення і введений для опису функцій, які не повертають значень, та для деяких інших цілей.
Скалярні типи поділяються на цілочисельні та дійсні типи.
Логічний тип, символьні і цілі типи даних є цілочисельним типом, для якого визначені всі операції з цілими числами.
Похідні типи визначаються на основі базових типів. Похідні типи поділяються на скалярні і структурні (агрегатні).
До скалярних похідних типів належать:
перерахування (enum — enumeration) — множина поіменованих цілих значень;
вказівники (ім'я_типу *);
посилання (ім'я_типу &).
Структурні типи:
масиви (тип_елементу ім'я_масиву[число_елементів]);
структури (struct);
об'єднання (union),
класи (class).
Дані в програмі можна розділити на змінні і константи. Перед використанням змінні і константи повинні бути оголошені за допомогою оператора оголошення.
Ключове слово const вказує, що записані праворуч ідентифікатори є константами (константними змінними). При цьому значення константи задається обов'язково і у програмі змінюватися не може. Крім константних змінних, константи можуть задаватися у вигляді літеральних (самовизначених) констант .
Логічні змінні типу bool можуть приймати одне з двох значень: false (хиба) та true (істина). За визначенням false рівне 0, a true рівне 1. Логічні змінні широко використовуються в операціях порівняння, логічних операціях і логічних виразах. Розмір змінної залежить від реалізації, але звичайно складає 2 байти.
Приклад оголошення:
bool reload = false, in_range = true;
Для явного задання діапазону можна використовувати модифікатори signed, unsigned.
Змінні і константи цілих типів також можуть оголошуватись за допомогою модифікаторів signed і unsigned. При використанні модифікаторів short і long дозволяється опускати ім'я int. Типи з плаваючою точкою або дійсні типи представлені трьома модифікаціями, що характеризують точність подання дійсних чисел: float — одиничної точності; double — подвійної точності; long double — розширеної точності.
Таблиця 2. Характеристики основних типів даних мови С++
Ім'я типу
Розмір пам'яті, байтів (16/32-розрядна)
Діапазон значень
для 16-розрядної архітектури
[signed] char
1
-128
127
unsigned char
1
0
255
[signed] short [int]
2
-32 768
32 767
unsigned short [int]
2
0
65 535
[signed] int
машинне слово
-32 768
32 767
unsigned int
машинне слово
0
65 535
[signed] long [int]
4
-2 147 483 648
2 147 483 647
[unsigned] long [int]
4
0
4 294 967 295
float
4
3.4e-38
3.4e38
double
8
1.7e-308
1.7e308
long double
10
3.4e-4932
3.4e4932
ВИБІР ІНДИВІДУАЛЬНОГО ЗАВДАННЯ
(день народження студента) % 6 = 6 % 6 = 0
(місяць народження студента) % 5 = 2 % 5 = 2
Завдання до (0,2) варіанту: Дослідити внутрішнє подання в пам’яті комп’ютера даних статичної структури для 4-х змінних : b,ch2,i6,d3
bool b
b = (день народження * 5) % 10 * місяць народження
b = (6 * 5) % 10 * 2 = 0
bool займає 1 байт.
Внутрiшнє придставлення змiнної b(bool): 00
unsigned char ch2
ch2 = друга літера = ‘A’ = 9710 = 6116
unsigned char займає 1 байт.
Внутрiшнє придставлення змiнної ch2(unsigned char ): 61
long i3
i3 = день народження * 215 = 6 * 215 = 129010
129010 = 50A16=0000 0000 0000 0000 0000 0101 0000 10102 – в прямому коді
long займає 4 байта.
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа
Внутрiшнє придставлення змiнної i3(long ): 0a 05 00 00
long double d3
X – день народження, Y – місяць народження, Z = X * Y
d3 = – Z . X e Y
d3 = -12.6e2
long double займає 8 байтів.
знак – 1 біт
порядок – 11 біт
мантиса – 52 біта
знак дорівнює 1
s(1біт)
е(11 біт)
m(52 біта)
1
10000001001
0011 1011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
мантиса = 12.6 * 10210 =126010 = 10011101100.02 = 1. 0011101100* 101010
порядок = 1023 + 10= 103310 = 100000010012
1100 0000 1001 0011 1011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00002 = C0 93 B0 00 00 00 00 0016
d3 = C0 93 B0 00 00 00 00 0016
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа
Внутрiшнє придставлення змiнної d3(long double ): 00 00 00 00 00 b0 93 C0
Код програми:#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
bool b = 6 * 5 % 10;
unsigned char ch2 = 'a';
unsigned i3 = 6 * 215;
long double d3 = -12.6e2;
unsigned char *vb = (unsigned char *)(&b);
cout << "Внутрiшнє представлення змiнної b(bool): ";
for (int i = 0; i<sizeof(b); i++)
printf("%02x ", vb[i]);
printf("\n");
vb = (unsigned char *)(&ch2);
cout << "Внутрiшнє представлення змiнної ch2(signed char): ";
for (int i = 0; i<sizeof(ch2); i++)
printf("%02x ", vb[i]);
printf("\n");
vb = (unsigned char *)(&i3);
cout << "Внутрiшнє представлення змiнної i3(long): ";
for (int i = 0; i<sizeof(i3); i++)
printf("%02x ", vb[i]);
printf("\n");
vb = (unsigned char *)(&d3);
cout << "Внутрiшнє представлення змiнної d3(long double): ";
for (int i = 0; i<sizeof(d3); i++)
printf("%02x ", vb[i]);
_getch();
return 0;
}
Скріншот виконання:
Висновок
У цій лабораторній роботі я навчився визначати кількість біт, які необхідні для пердставлення різних типів даних в пам'яті комп’ютера, визначити розмір вказівника і адреси на ці типи