Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторний практикум інф сис та стр даних.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.39 Mб
Скачать

3.Алгоритм розв’язання задачі.

Ми повинні показати представлення в пам’яті комп’ютера цілих та дійсних типів даних, з якими оперує наша програма. Алгоритм полягає в впорядкованому зчитуванні байтів збережених у пам’яті комп’ютера, за допомогою вказівників та посилань.

В пам’яті комп’ютера змінна типу floatзаймає 4 байти, в яких один біт виділяється під знак, 8- під порядок,23- під мантису.

4.Система тестів

4.1

Додатнє число 75 типу int в пам'яті комп’ютера зберігається в прямому двійковому коді і займає 4 байти:

0000 0000 0000 0000 0000 0000 0100 1011

В пам’яті комп’ютера цілі числа зберігаються у зворотному порядку розміщення байт числа:

0100 1011 0000 0000 0000 0000 0000 0000

Результат в 16-ковій системі числення: 4B 00 00 00.

4.2

Від'ємне число -375 типу longint в пам'яті комп’ютера зберігається в доповняльному двійковому коді і займає 4 байти: - 37510 = -17716 = - 2

0000 0000 0000 0000 0000 000101110111 - прямий код;

1111 1111 1111 1111 1111 111010001000 - обернений код;

+ __ ______________________ 1

1111 1111 1111 1111 1111 111010001001 - доповняльний код;

FFFFFE89 - в 16- ковій системі числення

В пам’яті комп’ютера зберігається у зворотному порядку розміщення байт числа:

1001 1000 1110 1111 1111 1111 1111 1111

Результат в 16- ковій системі числення: 89FEFFFF.

4.3

Розглянемо, як в пам'яті комп’ютера зберігається додатнє число 117,116 типу float.

Перевід цілої частини:

117/16=7 остача 5

7/16=0 остача 7

=>11710=7516

Перевід дробової частини:

0, 116 * 16 = 1,856

0, 856 * 16 = 13,696(1310 = D16)

0, 696 * 16 = 11,136 (1110 = B16)

0, 136 * 16 = 2,176

0,176 * 16 = 2,816

=>0,11610= 0,1DB2216

Отже: 117,11610=75,1DB2216=01110101,000111011011 0010 00102

Нормалізація: 01,110101000111011011 001000102*100110

Заокруглення:

1 ,110101000111011011 0010 0│01

+ _________ 0

1,110101000111011011 0010 0

Визначення мантиси: m=110101000111011011 0010 0

Визначення зміщеного порядку: е = 12710 + 610= 13310= 8516= 100001012

Визначення знакового розряду: s=0 (бо число додатнє).

Схема внутрішнього представлення:

s

e

m

1 біт

8 біт

23біт

Зборка за схемою:

s

e

m

0

10000101

1101010001110110110 0100

В 16- ковійсистемі

0 100 0010 1110 1010 0011 1011 0110 0100 2 = 42 EA 3B 6416

В пам’ятікомп’ютера буде зберігатися у зворотному порядкурозміщення байт числа:

0 110 0100 0011 1011 1110 1010 0100 0010

Результат в 16- ковій системі числення: 64 3BEA 42

4.4

Представлення змінної f2:

f2=-234.232

Перевід цілої частини:

-23410=-EA16

Перевід дробової частини:

0, 232 * 16 =3,712

0, 712 * 16 = 11,392(1110 = B16)

0, 392 * 16 = 6,272

0, 272 * 16 = 4,352

0,352 * 16 = 5,96

=>0.23210= 0,3B645 16

Отже:

-234.23210=-EA,3B64516=11101010,001110110110010001012

Нормалізація:

1,1101010001110110110010001012*100111

Заокруглення:

1 ,11010100011101101100100│01

+ _______ 0

1,11010100011101101100100

Визначення мантиси: m=11010100011101101100100

Визначення зміщеного порядку: е = 12710 + 710= 13410= 8616= 100001102

Визначення знакового розряду: s=1

Схема внутрішнього представлення:

s

e

m

1 біт

8 біт

23біт

Зборка за схемою:

s

e

m

1

10000110

11010100011101101100100

В 16- ковійсистемі:

1100 0011 0110 1010 0011 1011 0110 0100 = С3 6A 3B 6416

В пам’яті комп’ютера буде відображатись наступним чином:

64 3B 6AC3

5.Результати виконання програми.

Додатки:

Текст програми:

#include<stdio.h>

#include<conio.h>

#include<iostream>

int main (void)

{

// створення та ініціалізація змінних

int i;

int i1=75;

int i2=-375;

float f1 = 117.116;

float f2 = -234.232;

unsignedchar *vi1=(unsignedchar *)(&i1);

for (int i=0;i<sizeof(i1);i++)

//вивід змінних

printf("%02X ",vi1[i]);

printf("\n");

unsignedchar *vi2=(unsignedchar *)(&i2);

for (i=0;i<sizeof(i2);i++)

printf("%02X ",vi2[i]);

printf("\n");

unsignedchar *vf1=(unsignedchar *)(&f1);

for (i=0;i<sizeof(f1);i++)

printf("%02X ",vf1[i]);

printf("\n");

unsignedchar *vf2=(unsignedchar *)(&f2);

for (i=0;i<sizeof(f2);i++)

printf("%02X ",vf2[i]);

printf("\n");

getch();

return 0;

}