Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сука лаби.docx
Скачиваний:
17
Добавлен:
12.05.2015
Размер:
848.39 Кб
Скачать

Загальні відомості для виконання лабораторної роботи

Системи числення

Обчислювальна техніка базується на двійковій(бінарній, binary) системі числення. Для скороченого запису кодів чисел, команд і адрес , виведення значень широко застосовується шістнадцяткова (hexadecimal) система числення. У деяких випадках з’являється і вісімкова (octal) система числення. Кількість цифр у цих позиційних системах дорівнює базі систем:

цифри 0 і 1 для двійкової системи, які ще мають назву біти;

цифри 0…7 для вісімкової системи;

цифри 0…9 і букви-цифри A, B, C, D, E, F для шістнадцяткової системи.

Переведення чисел із двійкової системи у іншу(вісімкову, шістнадцяткову) дуже просте, тому що бази вісімкової () і шістнадцятко­вої () є кратними.

Двійкові цілі числа у мікропроцесорній техніці позначаються як послідовності двійкових цифр із суфіксом B, наприклад, 10101011B, або з префіксом B#, наприклад, B#10101011. Для шістнадцяткових чисел використовується або суфікс H, наприклад, 13А7В1Н, або взятий із мови С префікс , наприклад, 13А7В1.

Компілятор мови С/С++ розпізнає такі позначення:

0X число (шістнадцяткове),

0 Число(число (вісімкове),

число (десяткове).

Алгоритм переведення двійкового числа у шістнадцяткове такий:

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

Десятковий еквівалент

Шістнадцяткова цифра

Двійкове зображення

0

0

0000

1

1

0001

2

2

0010

3

3

0011

4

4

0100

5

5

0101

6

6

0110

7

7

0111

8

8

1000

9

9

1001

10

А

1010

11

В

1011

12

C

1100

13

D

1101

14

E

1110

15

F

1111

Наприклад, b# 101 1010 1110 01010х5AE5.

Зворотне перетворення:

кожна шістнадцяткова цифра замінюється відповідною четвіркою двійкових цифр, наприклад, 0x37B5 b#0011 0111 1011 0101.

Треба зауважити, що при переведенні значення числа не змінюється, змінюється тільки формат його зображення у різних системах числення.

Переведення числа із десяткової системи у двійкову (шістнадцяткову) більш складне, воно базується на алгоритмах Горнера.

Переведення цілого десяткового числа А у двійкову(шістнадцяткову) систему відбувається шляхом поступового ділення числа і часток на базу системи q(2,16) і записом остач у зворотному порядку

А=573

537=b#1000111101=b#10 0011 1101=0x23D.

573=0x23D=b#0010 0011 1101.

Зворотне переведення виконується множенням на базу системи, починаючи із самого старшого біта, і додаванням, як показано нижче:

A=0x23D

Переведення дробових десяткових чисел у дробові двійкові(шістнадцяткові) реалізується за іншим алгоритмом – послідовним множенням і виділенням цілої частини

де

Наприклад, десяткове дробове

Зворотне перетворення – поступове ділення, починаючи із самого молодшого розряда, і додавання, як нижче на прикладі: двійкове дробове

Формати чисел

Вісім двійкових розрядів – бітів створюють байт(byte). Біти у байті нумеруються справа наліво із самого молодшого біта від 0 до 7.

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

Восьмирозрядні числа – байти – числа з найменшою довжиною. 16 – розрядні (двобайтні) числа забезпечують проведення розрахунків з одинарною точністю і широко поширені у обчислювальних системах. 32 – розрядні (чотирьохбайтні) числа потребують більш складного апаратного забезпечення, але забезпечують розрахунки з подвійною точністю.

Як відомо, числа поділяються на числа з фіксованою крапкою (fixedpoint numbers) і числа з плаваючою крапкою (floatingpoint numbers).

Число з фіксованою крапкою може бути цілим знаковим або беззнаковим (двійкова крапка неявно стоїть праворуч від самого молодшого розряду) або дробовим знаковим або беззнаковим(двійкова крапка неявно стоїть або після знакового розряду (для знакових) або перед дробом (для беззнакових)).

Дробове знакове число має знаковий розряд, який є самим старшим розрядом, нульова ціла частина не зображується, далі неявно стоїть двійкова крапка і йдуть до самого молодшого розряду значущі розряди. Такий формат позначається як 1.15 або 1.31, тобто для 16-розрядного знакового числа маємо нульову цілу частину, знак (1 біт) і 15 значущих бітів.

Для беззнакового дробового числа знаковий біт непотрібний, нульову цілу частину теж не треба кодувати, то усі розряди числа є значущими, двійкова крапка неявно стоїть перед самим старшим розрядом. Такі формати позначаються як 0.16 або 0.32.

На рис.1 схематично показані формати чисел із фіксованою крапкою.

Користувач може створювати свої формати дійсних чисел із фіксованою крапкою, які мають ненульову цілу частнну числа, наприклад, для беззнакового числа формат 4.12 має на увазі 4 – розрядну цілу частину і 12 – розрядну дробову.

а) Ціле без знака

m 0

Значущі розряди

.неявне розташування

двійкової крапки

б)

Ціле зі знаком

m

0

Значущі розряди


.

Знаковий розряд ()

в)

m

Дробове без знака

0

Значущі розряди


.

(неявне розташування двійкової крапки)

г)

m

Дробове зі знаком

0

Значущі розряди


.

(неявне розташування крапки)

Знаковий розряд

д)

Можливе дійсне число без знака

Значущі розряди – ціла частина (k)

Значущі розряди – дробова частина (l)


. (неявне розташування двійкової крапки для числа формату k,l)

е) Можливе дійсне число зі знаком

Значущі розряди – ціла частина

Значущі розряди –

дробова частина


. (неявне розташування двійкової крапки для числа формату k,l)

Знаковий розряд

Рис.1 Формати чисел з фіксованою крапкою (m=15,31).

Цілі числа на С/С++ як числа з фіксованою крапкою представлені у таких форматах:

16-розрядні числа зі знаком (тип int ) (рис.4.1,б) , діапазон значень -32768 ... +32767,

16-розрядні числа без знака (тип unsigned int ) (рис.4.1,a) , діапазон значень 0 … 65536 ,

32-розрядні числа зі знаком (тип long int ) (рис.4.1,б) , діапазон значень

-2147483648 … +2147483647,

32-розрядні числа без знака (тип unsigned long ) (рис.4.1,а) , діапазон значень 0 ... 4294967295.

Дійсні числа вважаються числами з з плаваючою крапкою і мають такі типи :

32-розрядні знакові числа одинарної точності (тип float ) , діапазон значень +/- (1.2e-38 … 3.4e38) ,

64-розрядні знакові числа подвійної точності (тип double ) , діапазон значень +/- (2.225e-308 … 1.8e308) .

Формати дійсних чисел відповідають стандарту IEEE-754 .

Базовий одинарний формат (тип float )

31 30 23 22 0

знак

Зсунений порядок Е

E=p + 127

Дріб, біти 22...0 (Fraction)

Знак (S) кодується стандартно: “+”  0 , “-“ 1.

8-бітний зсунений порядок E=p + 127 дозволяє кодувати числа з порядком p = -127 ... +128 (E = 0...255) .Мантиса числа взята як 1.F , 1 і крапка не кодуються , 23-бітний дріб F забезпечує дискретність 2 -23 , точність 6-7 десяткових розрядів.

Стандарт IEEE-754 :

Якщо 0 < E <255 , то А = (-1)S 2E-1271. F.

Якщо E = 0 i F = 0 , то А =(-1)S 0 (знаковий нуль).

Якщо E = 255 i F = 0 , то А = (-1)S∞ (знакова нескінченність).

Якщо E = 0 i F не нуль , то А = (-1)S 2-126 0. F .

Якщо E = 255 i F не нуль , то А не число.

Приклади.

1. А =22.5=101101.12 =1.01101*24 . S = 0 , E = 4 + 127 = 131 (10000011) ,

F = .01101.

Код двійковий 0100 0001 1011 0100 0000 0000 0000 0000 ,

у шістнадцятьковій системі 0х41B40000.

2. E = 1 , F = 0 ,найменше число Amin = 2-126 =1.175*10-38

3. E = 254 , F =.11111..12 = 1 – 2-23 ,найбільше число Amax = 2127 *(2 - 2-23 ) = =3.403*1038

Базовий подвійний формат (тип double )

63 62 50 51 0

знак

Зсунений порядок Е

E=p + 1023

Дріб, біти 51...0 (Fraction)

Знак (S) кодується стандартно: “+” à 0 , “-“ à1.

11-бітний зсунений порядок E=p + 1023 дозволяє кодувати числа з порядком p = -1023 ... +1024 (E = 0...2047) .Мантиса числа взята як 1.F , 1 і крапка не кодуються , 52-бітний дріб F забезпечує дискретність 2 -52 , точність 16-17 десяткових розрядів.

Стандарт IEEE-754 :

Якщо 0 < E <2047 , то А = (-1)S 2E-10231. F.

Якщо E = 0 i F = 0 , то А =(-1)S 0 (знаковий нуль).

Якщо E = 2047 i F = 0 , то А = (-1)S∞ (знакова нескінченність).

Якщо E = 0 i F не нуль , то А = (-1)S 2-1022 0. F .

Якщо E = 255 i F не нуль , то А не число.

Приклади.

1. А =22.5=101101.12 =1.01101*24 . S = 0 , E = 4 + 127 = 131 (10000011) ,

F = .01101.

Код двійковий 0100 0000 0011 0110 1000 0000 0000 0000 0000 .... 0000 0000

у шістнадцятьковій системі 0х4036800000000000.

2. E = 1 , F = 0 ,найменше число Amin = 2-1022 =2.225*10-308

3. E = 2045 , F =.11111..12 = 1 – 2-52 ,найбільше число Amax = 21023 *(2 - 2-52 ) = =1.8*1038

Базовий формат підвищеної точності (тип long double )

79 78 72 7164 63 0

знак

Зсунений порядок

E=p + 16383

E

Дріб, біти 63...0 (Fraction)

Знак (S) кодується стандартно: “+” à 0 , “-“ à1.

15-бітний зсунений порядок E=p + 16383 дозволяє кодувати числа з порядком p = -16383 ... +16384 (E = 0...32767) .Мантиса числа взята як 1.F , 1 кодується , крапка не кодується , 63-бітний дріб F забезпечує дискретність 2 -63 , точність 19 десяткових розрядів. Діапазон чисел 10-4932 ... 10+4932 .

Приклад.

A=37.6875 = 1.001011011*25

Е =5+16383 = 16388 = 16384 + 4

код А2 01000000 00000100 1001 0110 1100 0000 ....0000

код А 16 0х40 04 96 С0 00 00 00 00 00 00

Вправи для самоперевірки

1. Створіть коди одинарний та подвійний для чисел А = 25.75 ,

А=37.6875 ,А = 43.6875.

2. Чи відповідають числу А =57.65625 такі коди : 0х426D4000 , 0x404DA80000000000 ?

3.Якому числу відповідають наступні коди : 0x422FC000 ,0x4045D80000000000?

Типи і коди даних

Діапазон значень і дискретність чисел (найменша відстань між двома сусідніми значеннями чисел) залежать від їх типу, формату і коду.

Почнемо з кодів . Для кодування чисел використовують прямий, обернений і доповняльний коди. Додатні числа мають однакові прямий і доповняльний коди. Відрізняються коди тільки від’ємних чисел. Обчислювальна арифметика побудована для від’ємних чисел у доповняльному коді (two’s complement).

Число у прямому коді має знаковий біт – самий старший розряд (1 для «-», 0 для «+»), решта бітів – абсолютне значення числа

n-1

0

знак

|x|


Початкові значення змінних можуть мати пряме кодування. Але для введення їх у програму потрібне перетворення у доповняльний код (для від’ємних чисел).

Обернений код від’ємного числа (one’s complement) має 1 у знаковому розряді, а значущі біти отримують протилежні значення, тобто нуль замінюється на 1, а 1 замінюється на нуль:

Наприклад, для 8 – розрядних форматів (n=8) число – 10 має такий прямий код

7

0

1

0

0

0

1

0

1

0

0x8A.

Овернений код можна отримати, якщо від B#11111111 відняти 10:

у двійковій системі

0xF5,

у шістнадцятковій системі

або у десятковій системі

.

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

.

Збільшений на 1 обернений код і є доповняльним.

(1 і n нулів).

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

у шістнадцятковій системі

чи у десятковій системі

.

Щоб отримати доповняльний код від’ємного числа вручну, треба виконати такі дії:

переглядаємо біти абсолютного значення справа наліво, залишаємо без змін нулі і перший одиничний біт, далі наступні біти перевертаємо, тобто

Розглянемо цілі числа. Цілі беззнакові числа не мають знакових розрядів, усі біти значущі. Це додатні числа. Дискретність дорівнює 1, значенню самого молодшого розряду. Діапазон існування значень чисел залежить від формату n і дорівнює

Найчастіше цілі беззнакові числа – це адреси.

Знакові цілі числа мають різні діапазони значень і значень кодів.

У прямому коді

Рис. 3 Діапазони значень і кодів знакових цілих чисел

У прямому коді маємо два нулі – додатний (код 0) і від’ємний (код ):

і .

Діапазон значень чисел у доповняльному коді збільшується на одне значення, замість від’ємного нуля вводиться найменше від’ємне:

У програмі запис від’ємної константи автоматично створює її доповняльний код.Додавання зліва одиниць не змінює значення числа у доповняльному коді. Якщо у коді числа старший шістнадцятковий розряд більше або дорівнює 8, то це число від’ємне у доповняльному коді.

Вправи для самоперевірки

1. Вибрати формати і записати коди таких чисел у двійковій і шістнадцятковій системах числення: 127, -255, 550000, -45000.

2. Задані від’ємні числа у прямому коді: 0x8123, 0xA37B, 0xF7F5.

Записати числа у доповняльному коді.

Програмне отримання кодів

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

Програма мовою С (файл intcodes.c) організує виведення значень змінних a ,b та їх кодів (доповняльний – complementary ,обернений – inverse ).

#include <stdio.h>

main()

{

int a=-20,b=20;

printf("\n a=%d b=%d",a,b);

printf("\n bit complement a,b \n a=%x b=%x",a,b);

a=~20;

printf("\n bit inverse a \n a=%x ",a);

return 0;

}

Результат виконання

a = -20 b = 20

bit complement a,b

a = ffec b = 14

bit inverse a

a = ffeb

Примітка

В операторі printf %d - параметр перетворення цілочислового значення із двійкової системи у десяткову ,а %x - параметр перетворення вмісту із двійкової системи у шістнадцяткову .

Програма мовою С++ (файл intcodes.cpp) працює аналогічно

#include <iostream.h>

main()

{

int a=-20,b=20;

cout<<"\n a="<<a<<" b="<<b<<endl;

cout<<"bit complement a,b \n a="<<hex<<a<<" b="<<b<<endl;

a=~20;cout<<"bit inverse a\n a="<<hex<<a;

return 0;

}