Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи №1
з дисципліни
"Програмування. Частина III.
Структури даних та алгоритми"
Варіант:
i1 = 68
i2 = i1*(-5) = -340
f1 = 97.115
f2 = f1*(-2) = -194.23
Мета роботи
Дослідження внутрішнього представлення в пам’яті комп’ютера базових
типів даних статичної структури.
2. Постановка задачі
Дослідити внутрішнє представлення в пам’яті комп’ютера цілих та дійсних
типів даних.
Розглянути наступні базові типи даних:
int i1 , і2;
float f1 , f2;
3. Алгоритм розв’язання задачі
Спочатку ініціалізуємо змінні i1,i2,f1,f2 моїми значеннями мого варіанту.
Потім почергово присвоюємо змінним типу char* адреси змінних i1, i2, f1, f2,
які явно перетворюються у тип (unsigned char *)
unsigned char *vi1=(unsigned char *)(&i1);
unsigned char *vi2=(unsigned char *)(&i2);
unsigned char *vf1=(unsigned char *)(&f1);
unsigned char *vf2=(unsigned char *)(&f2);
Потім у циклах виводимо значення наших вказівників *vi1, *vi2, *vf1, *vf2 на
екран
//print i1
printf("i1:\t");
for (int i=0;i<sizeof(i1);i++)
printf("%02X ",vi1[i]);
printf("\n");
//print i2
printf("i2:\t");
for (int i=0;i<sizeof(i2);i++)
printf("%02X ",vi2[i]);
printf("\n");
//print l1
printf("f1:\t");
for (int i=0;i<sizeof(f1);i++)
printf("%02X ",vf1[i]);
printf("\n");
//print i2
printf("f2:\t");
for (int i=0;i<sizeof(f2);i++)
printf("%02X ",vf2[i]);
printf("\n");
4. Система тестів
4.1 Приклад 1
Int I1 = 68
68:16=4 (4);
4:16=0 (4).
6810 = 4416 = 100 01002
так як int займає 4 байта, то 100 01002 запишеться так:
0000 0000 0000 0000 0000 0000 0100 01002
ВПК: 0100 0100 0000 0000 0000 0000 0000 00002
4 4 0 0 0 0 0 016
4.2 Приклад 2
int i2 = i1*(-5) = -340
340:16=21 (4)
21:16=1 (5)
1:16=0 (1)
-34010 =- 15416 = -0000 0000 0000 0000 0000 0001 0101 01002
1111 1111 1111 1111 1111 1110 1010 10112
+ 1
1111 1111 1111 1111 1111 1110 1010 11002
ВПК: 1010 1100 1111 1110 1111 1111 1111 11112
A C F E F F F F16
4.3 Приклад 3
float f1 = 97.115
97.11510 = 61,1D70A3D716 =
= 0110 0001,0001 1101 0111 0000 1010 0011 1101 01112
97:16=6 (1)
6:16=0 (6)
0.115*16=1.84 0.84*16=13.44 0.44*16=7.04 0.04*16=0.64
0.64*16=10.24 0.24*16=3.84 0.84*16=13.44 0.44*16=7.04
нормалізація:
01,10 0001 0001 1101 0111 0000 1010 0011 1101 01112*10110
заокруглення:
1,100 0010 0011 1010 1110 0001
мантиса m = 100 0010 0011 1010 1110 0001
Визначення зміщеного порядку:
е = 12710 + 610 = 13310 = 8516 = 1000 01012
знак s = 0
Схема внутрішнього представлення:
s
e
m
1 біт
8 біт
23 біт
Збірка за схемою:
s
e
m
0
1000 0101
100 0010 0011 1010 1110 0001
0100 0010 1100 0010 0011 1010 1110 00012= 42 C2 3A E116
ВПК: E1 3A C2 42
4.4 Приклад 4
float f2=f1*(-2) =-194.2310 =-C2,3AE147AE16=
=-1100 0010,0011 1010 1110 0001 0100 0111 1010 11102
194:16=12 (2)
12:16=0 (12)
0.23*16=3.68 0.68*16=10.88 0.88*16=14.08 0.8*16=1.28
0.28*16=4.48 0.48*16=7.68 0.68*16=10.88 0.88*16=14.08
float займає 4 байт
нормалізація:
1,100 0010 0011 1010 1110 0001 0100 01112*10111
заокруглення:
1,100 0010 0011 1010 1110 00012*10111
мантиса m = 100 0010 0011 1010 1110 0001
Визначення зміщеного порядку:
е = 12710 +710 =13410=8616 = 1000 01102
знак s = 1
Схема внутрішнього представлення:
s
e
m
1 біт
8 біт
23 біт
Збірка за схемою:
s
e
m
1
1000 0110
100 0010 0011 1010 1110 0001
1100 0011 0100 0010 0011 1010 1110 00102 = C3 42 3A E116
ВПК: E1 3A 42 C3
5. Pезультати виконання програми
/
Рис 1. Демонстрація роботи програми
Висновки: Виконуючи лабораторну роботу я дізнався як в пам'яті комп'ютера представляються різні типи чисел, навчився вручну робити обрахунки та написав програму, яка це робить автоматично.
Додатки
Код програми:
#include<stdio.h>
#include<conio.h>
int main (void)
{
int i1 = 67,i2 = i1*(-5);
float f1 = 104.97,f2 = f1*(-2);
unsigned char *vi1=(unsigned char *)(&i1);
unsigned char *vi2=(unsigned char *)(&i2);
unsigned char *vf1=(unsigned char *)(&f1);
unsigned char *vf2=(unsigned char *)(&f2);
//print i1
printf("i1:\t");
for (int i=0;i<sizeof(i1);i++)
printf("%02X ",vi1[i]);
printf("\n");
//print i2
printf("i2:\t");
for (int i=0;i<sizeof(i2);i++)
printf("%02X ",vi2[i]);
printf("\n");
//print l1
printf("f1:\t");
for (int i=0;i<sizeof(f1);i++)
printf("%02X ",vf1[i]);
printf("\n");
//print i2
printf("f2:\t");
for (int i=0;i<sizeof(f2);i++)
printf("%02X ",vf2[i]);
printf("\n");
getch();
return 0;
}