Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи №1
з дисципліни: “ Програмування. Частина III. Структури даних та алгоритми ”
на тему: “ Представлення в пам’яті комп’ютера
даних цілих та дійсних типів ”
Вибір індивідуального завдання:
i1 = Рr1 = №(I) = 84
i2 = i1 * (–5) = –420
f1 = рr2 . рr3 = №(u) . №(r) = 105.111
f2 = f1*(–3) = –315 . 333
Мета роботи: Дослідження внутрішнього представлення в пам’яті комп’ютера (ВПК) статичних даних базових типів.
Постановка задачі:
Дослідити внутрішнє представлення в пам’яті комп’ютера даних цілих та дійсних типів. Розглянути наступні базові типи даних:
int i1 , і2;
float f1 , f2;
Ініціалізувати оголошенні змінні наступними значеннями:
i1 = Рr1;
i2 = i1 * (–5);
f1 = рr2 . рr3;
f2 = f1*(–3);
Де:
Рr1 - ASCII–код першої літери прізвища (латинська велика літера),
рr2 - ASCII–код другої літери прізвища (латинська мала літера),
рr3 - ASCII–код третьої літери прізвища (латинська мала літера).
Система тестів:
Система тестів-змінних у ВПК
1) 0000 0000 0000 0000 0000 0000 0101 0100
В пам’яті комп’ютера цілі числа зберігаються у зворотному порядку розміщення байт числа:
0101 0100 0000 0000 0000 0000 0000 0000
Результат в 16-ковій системі числення: 54 00 00 00.
2) : - 42010 = - 1A416 = - 1101001002
0000 0000 0000 0000 0000 0001 1010 0100 - прямий код;
1111 1111 1111 1111 1111 1110 0101 1011 - обернений код;
+ 1
1111 1111 1111 1111 1111 1110 0101 1100 - доповняльний код;
F F F F F E 5 C - в 16- ковій системі числення
В пам’яті комп’ютера зберігається у зворотному порядку розміщення байт числа:
1100 1010 1111 1110 1111 1111 1111 1111
Результат в 16- ковій системі числення: 5C FE FF FF.
3) В пам'яті комп’ютера зберігається додатнє число 105, 111 типу float .
Перевід цілої частини:
105 10 = 69 16= 0110 10012
Перевід дробової частини:
0, 111 * 16 = 1,776
0, 776 * 16 = 12,416
0, 416 * 16 = 6,656
0, 656 * 16 = 10,496
=> 0,111 10 = 0,1C6A 16
Отже: 105,111 10 = 69, 1C6A 16 = 0110 1001 , 0001 1100 0110 1010 2
Нормалізація: 01,10 1001 0001 1100 0110 1010 2 * 100110
Заокруглення:
1,10 1001 0001 1100 0110 1010 0
12710 = 111 1111 2
+ 0110
1000 0101 2
Визначення знакового розряду: s=0 (бо число додатнє).
Схема внутрішнього представлення:
s
e
m
1 біт
8 біт
23 біт
Зборка за схемою:
s
e
m
0
1000 0101
10 1001 0001 1100 0110 1010 0
В 16- ковій системі числення: 0100 0010 1101 0010 0011 1000 1101 0100 2= 42 D2 38 D4 16
В пам’яті комп’ютера буде зберігатися у зворотному порядку
Результат в 16- ковій системі числення: D4 38 D2 42
4) В пам'яті комп’ютера зберігається від’ємне число -315 . 333типу float .
Перевід цілої частини:
315 10 = 13B 16= 1 0011 10112
Перевід дробової частини:
0, 333 * 16 = 5,328
0, 328 * 16 = 5,248
0, 248 * 16 = 3,968
0, 832 * 16 = 15,488
=> 0,333 10 = 0,553F 16
Отже: 315,333 10 = 13B, 553F 16 = 1 0011 1011 , 0101 0101 0011 1111 2
Нормалізація: 1, 0011 1011 0101 0101 0011 1111 2 * 101000
Заокруглення:
1, 0011 1011 0101 0101 0011 111│1
+ 1
1, 0011 1011 0101 0101 0100 000
12710 = 111 1111 2
+ 1000
1000 01112
Визначення знакового розряду: s=1 (бо число від’ємне).
Схема внутрішнього представлення:
s
e
m
1 біт
8 біт
23 біт
Зборка за схемою:
s
e
m
1
1000 0111
0011 1011 0101 0101 0100 000
В 16- ковій системі числення: 1100 0011 1001 1101 1010 1010 1010 00002= C3 9D AA A0 16
В пам’яті комп’ютера буде зберігатися у зворотному порядку
Результат в 16- ковій системі числення: A0 AA 9D C3
Алгоритм розв’язання задачі:
1) Ініціалізуємо вказані змінні згідно з вхідними даними. А саме, ASCII кодами перших трьох літер прізвища і виконуємо відповідні дії
2)Робимо явне приведення кожної змінної до динамічного типу (unsigned char)*.
3)Виводимо посимвольно відповідні вказівники типу unsigned char
Результати виконання програми:
/
Висновок
Я навчився представляти дані у ВПК
Додаток 1
#include<stdio.h>
void main(){
int i1;
int i2;
float f1;
float f2;
i1 = 73;
i2 = i1*(-5);
f1 = 117.114;
f2 = f1*(-3);
unsigned char *ins = (unsigned char *)(&i1);
printf("i1 is:");
for (int i = 0; i < sizeof(i1); i++)
printf("%02X ", ins[i]);
printf("\n");
printf("i2 is:");
unsigned char *ins1 = (unsigned char *)(&i2);
for (int i = 0; i < sizeof(i2); i++)
printf("%02X ", ins1[i]);
printf("\n");
printf("f1 is:",f1);
unsigned char *ins2 = (unsigned char *)(&f1);
for (int i = 0; i < sizeof(f1); i++)
printf("%02X ", ins2[i]);
printf("\n");
printf("f2 is:");
unsigned char *ins3 = (unsigned char *)(&f2);
for (int i = 0; i < sizeof(f2); i++)
printf("%02X ", ins3[i]);
printf("\n");
}