Міністерство освіти і науки, молоді та спорту України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи № 1
на тему:
"Представлення в пам’яті комп’ютера
даних цілих та дійсних типів"
з дисципліни:
" Програмування. Частина III. Структури даних та алгоритми "
Вибір індивідуального завдання:
i1 = Рr1 = №(С) = 67
i2 = i1 * (–5) = –335
f1 = рr2 . рr3 = №(h) . №(a) = 97 . 104
f2 = f1*(–3) = –291,312
Мета роботи:
Дослідження внутрішнього представлення в пам’яті комп’ютера (ВПК) статичних даних базових типів.
Постановка задачі:
Дослідити внутрішнє представлення в пам’яті комп’ютера даних цілих та дійсних типів. Розглянути наступні базові типи даних:
int i1 , і2;
float f1 , f2;
Система тестів:
Представлення ВПК змінної i1 = 67
Додатнє число 67 типу int в пам'яті комп’ютера зберігається в прямому двійковому коді і займає 4 байти: → 0000 0000 0000 0000 0000 0000 0100 0011
В пам’яті комп’ютера цілі числа зберігаються у зворотному порядку розміщення байт числа:
0100 0011 0000 0000 0000 0000 0000 0000
Результат в 16-ковій системі числення: 43 00 00 00.
Представлення ВПК змінної i2 = -335
Від'ємне число -485 типу long int в пам'яті комп’ютера зберігається в доповняльному двійковому коді і займає 4 байти: - 33510 = - 14F16 = - 1 0100 11112
0000 0000 0000 0000 0000 0001 0100 1111 - прямий код;
1111 1111 1111 1111 1111 1110 1011 0000 - обернений код;
+ 1
1111 1111 1111 1111 1111 1110 1011 0001 - доповняльний код;
F F F F F E B 1 - в 16- ковій системі числення
В пам’яті комп’ютера зберігається у зворотному порядку розміщення байт числа:
1011 0001 1111 1110 1111 1111 1111 1111
Результат в 16- ковій системі числення: B1 FE FF FF.
Представлення ВПК змінної f1 = 97.104
Розглянемо, як в пам'яті комп’ютера зберігається додатнє число 97.104 типу float .
Перевід цілої частини: 97 10 = 6116
Перевід дробової частини:
0, 104 * 16 = 1,664
0, 664 * 16 = 10,624 (1010 = A16)
0, 624 * 16 = 9,984
0, 984 * 16 = 15,744 (1510 = F16)
=> 0,104 10 = 0,1A9F 16
Отже: 97,104 10 = 61,1A9F 16 = 0110 0001, 0001 1010 1001 11112
Нормалізація: 01, 10 0001 0001 1010 1001 11112 * 10110
Заокруглення:
1, 10 0001 0001 1010 1001 1111 │1
+ 1
1, 10 0001 0001 1010 1001 1111 1
Визначення мантиси: m= 0 0001 0001 1010 1001 1111 1
Визначення зміщеного порядку: е = 12710 + 610 = 133 10 = 85 16 = 1000 0101 2
Інший спосіб: 12710 = 111 1111 2
+ 0110
1000 0101 2
Визначення знакового розряду: s=0 (бо число додатнє).
Схема внутрішнього представлення:
s
e
m
1 біт
8 біт
23 біт
Зборка за схемою:
s
e
m
0
1000 0101
10 0001 0001 1010 1001 1111 1
В 16- ковій системі числення: 0100 0010 1100 0010 0011 0101 0011 1111 2= 42 C2 35 3F 16
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа:
0011 1111 0011 0101 1100 0010 0100 0010
Результат в 16- ковій системі числення: 3F 35 C2 42
Представлення ВПК змінної f2 = -291,312
Розглянемо, як в пам'яті комп’ютера зберігається від'ємне число -291,312 типу float .
Перевід цілої частини: -29110 = 12316
Перевід дробової частини:
0, 312 * 16 = 4,992
0, 992 * 16 = 15,872 (1510 = F16)
0, 872 * 16 = 13,952 (1310 = D16)
=> 0,312 10 = 0,4FD 16
Отже: -291,312 10 = 123,4FD 16 = -0001 0010 0011 , 0100 1111 11012
Нормалізація: 0001 , 0010 0011 0100 1111 11012 * 101000
Заокруглення:
1 , 0010 0011 0100 1111 110│1
+ 1
1 , 0010 0011 0100 1111 111
Визначення мантиси: m= 0010 0011 0100 1111 111
Визначення зміщеного порядку: е = 12710 + 810 = 135 10 = 87 16 = 1000 0111 2
Інший спосіб: 12710 = 111 1111 2
+ 1000
1000 0111 2
Визначення знакового розряду: s=1 (бо число від'ємне).
Схема внутрішнього представлення:
s
e
m
1 біт
8 біт
23 біт
Зборка за схемою:
s
e
m
1
1000 0111
0010 0011 0100 1111 1110 000
В 16- ковій системі числення: 1100 0011 1001 0001 1010 0111 1111 0000 2= C3 91 A7 F0 16
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа:
1111 0000 1010 0111 1001 0001 1100 0011
Результат в 16- ковій системі числення: F0 A7 91 C3
Алгоритм розв’язання задачі:
#include<stdio.h>
#include<conio.h>
void main (void)
{
float f1, f2;
int i1, i2;
i1 = 67;
i2 = -335;
f1 = 97.104;
f2 = -291.312;
{
unsigned char *vx=(unsigned char *)(&i1);
printf("i1 = ");
for (int i=0;i<sizeof(i1);i++)
printf("%02X ",vx[i]);
printf("\n");
}
{
unsigned char *vx=(unsigned char *)(&i2);
printf("i2 = ");
for (int i=0;i<sizeof(i2);i++)
printf("%02X ",vx[i]);
printf("\n");
}
{
unsigned char *vx=(unsigned char *)(&f1);
printf("f1 = ");
for (int i=0;i<sizeof(f1);i++)
printf("%02X ",vx[i]);
printf("\n");
}
{
unsigned char *vx=(unsigned char *)(&f2);
printf("f2 = ");
for (int i=0;i<sizeof(f2);i++)
printf("%02X ",vx[i]);
printf("\n");
}
}
Результат виконання програми:
/
Рис1. Ескіз вікна з результатом виконання програми
Висновок: в цій лабораторній роботі я зрозумів принцип представлення чисел в комп’ютері, їхньою структурою та типами. Вдосконалив свої знання про представлення чисел в різних системах числення та типах даних, а також закріпив нові знання щодо мови програмування С++.