Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Перевірка за допомогою демонстраційної програми правильності результатів, отриманих під час виконання індивідуального завдання у відповідності з п.4




Лабораторна робота № 3

МАШИННІ КОДИ. ДОДАВАННЯ ТА ВІДНІМАННЯ ЦІЛИХ ДВІЙКОВИХ ЧИСЕЛ

 

 

Мета роботи

 

В результаті виконання лабораторної роботи:

· навчитись зображувати в прямому, зворотному та додатковому кодах цілі двійкові числа із знаком;

· навчитись використовувати вказані коди для виконання операцій додавання та віднімання цілих двійкових чисел із знаком.

 

Теми для попереднього пророблення

2.1. Особливості зображення цілих додатних і від’ємних двійкових чисел в прямому, зворотному та додатковому кодах.

2.2. Правила додавання двійкових цифр.

2.3. Модифіковані зворотний і додатковий коди.

Завдання до лабораторної роботи

3.1.  Із таблиці 1, у відповідності з порядковим номером в журналі групи, вибрати значення X і Y, які подані одне – в додатковому, а друге – в зворотному коді, але для зображення обох використати поле довжиною 1 байт (мати на увазі, що далі в таблицях і тексті зображення знака числа відокремлюється від зображення значущої частини числа комою).

 

Таблиця 1 – Індивідуальні завдання (початок)

Варі­ант X (Додатковий код) Y (Зворотний код) Варі­ант X (Додатковий код) Y (Зворотний код)
1 1,110111 0,110111 16 0,1101010 1,110110
2 1,1010111 0,10111 17 0,000111 1,1110001
3 1,1110110 0,101011 18 1,11111 0,110000
4 0,101011 1,1011001 19 0,1001011 1,100110
5 0,1111101 1,10111 20 0,01011 1,1011011
6 0,100111 1,0111101 21 1,1011001 0,1100100
7 1,1001111 0,100010 22 0,11011 1,1001011
8 0,1001100 1,1101101 23 1,0111100 0,1101

Таблиця 1 – Індивідуальні завдання (закінчення)

Варі­ант X (Додатковий код) Y (Зворотний код) Варі­ант X (Додатковий код) Y (Зворотний код)
9 1,0111 0,100010 24 0,101110 1,1010111
10 0,10111 1,101110 25 0,1101101 1,110
11 0,1101011 1,100011 26 1,1111 0,1011101
12 1,100011 0,111001 27 0,1001011 1,111101
13 1,01110 0,111010 28 0,111011 1,100111
14 0,110001 1,0110110 29 1,111 0,101111
15 1,10111 0,10011 30 0,1011 1,1100000

3.2.Для свого варіанта вручну отримати коди десятковий, двійковий, прямий, зворотний та додатковий для +X, –X, +Y і –Y і заповнити таблицю 2, як показано для варіанта 30 із таблиці 1.

 

Таблиця 2 – Приклад отримання кодів (для варіанта № 30 із таблиці 1)

Коди +X –X +Y –Y
Десятковий +11 –11 +31 –31
Двійковий +1011 –1011 +11111 –11111
Прямий 0,0001011 1,0001011 0,0011111 1,0011111
Зворотний 0,0001011 1,1110100 0,0011111 1,1100000
Додатковий 0,0001011 1,1110101 0,0011111 1,1100001

 

Таблиця 3 (а) – Приклад отримання результатів (для варіанта № 30 із таблиці 1)

Зображення заданих чисел в різних кодах

Додавання при різних комбінаціях знаків

Результат в зада­ному коді Результат в прямому коді Резуль­тат в десят­ковому коді
Х  в десятковому коді (+11)

В додат­ковому

 коді

+X + (–Y) 1,1101100 1,0010100 –20
Y  в десятковому коді (–31) +X + (+Y) 0,0101010 0,0101010 +42
Х  в прямому коді (0,0001011) –X + (–Y) 1,1010110 1,0101010 –42
Y  в прямому коді (1,0011111) –X + (+Y) 0,0010100 0,0010100 +20

 

 

Таблиця 3 (б) – Приклад отримання результатів (для варіанта № 30 із таблиці 1)

Зображення заданих чисел в різних кодах

Додавання при різних комбінаціях знаків

Результат в зада­ному коді Результат в прямому коді Резуль­тат в десят­ковому коді
X  в зворотному коді (0,0001011)

В зворот­ному

 коді

+X + (–Y) 1,1101011    
Y  в зворотному коді (1,1100000) +X + (+Y) 0,0101010    
X  в додатковому коді (0,0001011) –X + (–Y) 1,1010101    
Y  в додатковому коді (1,1100001) –X + (+Y) 0,0010100    

 

3.3.Виконати вручну, з використанням однобайтового поля, додавання в додатковому і зворотному кодах двійкових чисел X і Y, використовуючи різні комбінації знаків у цих чисел, а саме (+X,+Y), (+X,–Y), (–X,–Y) і (–X,+Y).

3.4.Результати додавання, виконані в п.3.3, відтворити в таблиці 3, як показано для варіанта 30 із таблиці 1.

3.5.Для всіх комбінацій знаків у чисел X і Y отримати результати шляхом запускання демонстраційної програми.

3.6.Отримані після запускання демонстраційної програми результати порівняти з отриманими вручну.

 

Хід отримання результатів

  4.1. Правила додавання двійкових цифр чисел А і В представлені в таблиці 4. Тут показані правила додавання двійкових цифр ai та bi однойменних розрядів чисел А і В з урахуванням можливого переносу Pі-1 із попереднього розряду.

4.2. Слід мати на увазі, що операція додавання виконується в модифікованих зворотному та додатковому кодах. Операція віднімання замінюється операцією додавання з від’ємним числом.

Далі в тексті використані такі умовні позначення: пк – прямий код; зк – зворотний код;    мзк – модифікований зворотний код; дк – додатковий код; мдк – модифікований додатковий код.

При зображенні цілих чисел зі знаком використовуються один або два (для модифікованих кодів) старших двійкових розрядів для зображення кода знака (0 або 00 – для додатного числа і 1 або 11 – для від’ємного числа).

 


  Таблиця 4 Правила додавання двійкових цифр

Значення i-х двійкових розрядів

чисел А, В і Pi–1

Розряд суми Si

Перенос в наступний розряд Рi

аi bi Pi–1
0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1

 

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

 

Наприклад:

 

А = +1011       [A]пк = 0,0001011

В = –11111  [B]пк = 1,0011111

 

   4.4. Зворотний код цілого додатного двійкового числа співпадає з його прямим кодом. Зворотний код цілого від’ємного числа можна отримати із прямого коду відповідного цілого додатного числа, якщо  в знаковому розряді вказати 1, а решту цифр прямого коду змінити на протилежні. Якщо маємо зворотний код цілого від’ємного числа, то можемо отримати прямий код відповідного цілого додатного числа, якщо в знаковому розряді вкажемо 0, а решту цифр зворотного коду змінимо на протилежні.

В зворотному коді знаковий розряд і значуща частина числа вважаються єдиним цілим. Знак суми отримується автоматично під час додавання вмісту знакових розрядів доданків і одиниці переносу із значущої частини доданків, якщо одиниця переносу є.

 Особливістю використання зворотного коду при виконанні операції додавання цілих двійкових чисел із знаком є те, що при появі одиниці переносу із знакового розряду має бути виконана корекція суми. Для здійснення корекції необхідно виконати операцію додавання одиниці переносу зі значущою частиною числа.

 

Приклад 1:

А = + 11101  (+29); В = – 01011 (–11)

 

0,11101 [A]зк

+1,10100   [B]зк

10,10001  –>  0,10010  –> + 10010 (+18)

Приклад 2:

А = – 000110  (–6); В = – 010111   (–23)

 

1,111001 [A]зк

+  1,101000    [B]зк

11,100001  –>  1,100010   –>   1, 011101   –> – 011101 (–29)

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

 

Приклад 3:

              А = – 10011    (–19) В = – 10001   (–17)

 

11,01100 [A]мзк

+ 11,01110     [B]мзк

110,11010

 

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

Будемо мати:

 

110,11010 –>   10,11011

 

Відмінність цифр в знакових розрядах свідчить про те, що треба виконати модифікацію суми. Для цього отримане число разом із знаковими розрядами зрушують на один розряд вправо, а у звільненому лівому знаковому розряді дублюють значення отриманого після зсуву правого знакового розряду. Будемо мати:

 

10,11011 –>  11,011011

Зрештою будемо мати:

                        11,011011 –> 1,100100 –> – 100100  (–36)

4.5.Додатковий код цілого додатного двійкового числа співпадає з його прямим кодом. Додатковий код цілого від’ємного числа можна отримати із прямого коду відповідного цілого додатного числа, якщо  в знаковому розряді вказати 1, а решту цифр прямого коду змінити на протилежні, а потім виконати операцію додавання отриманого коду з одиницею.

 Якщо маємо додатковий код цілого від’ємного числа, то можемо отримати прямий код відповідного цілого додатного числа, якщо виконаємо вказані вище дії, але в знаковий розряд впишемо 0.

В додатковому коді знаковий розряд і значуща частина числа вважаються єдиним цілим. Знак суми отримується автоматично під час додавання вмісту знакових розрядів доданків і одиниці переносу із значущої частини доданків, якщо одиниця переносу є.

 

Приклад 4:

 

[А]пк = 1,110100       [A]дк = 1,001011 + 0,000001 = 1,001100

  [A]дк = 1,001100   –>  0,110011 + 0,000001 =  0,110100

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

 

Приклад 5:

 

А = +10101  В = +1110     D = –10101 E = –01110

 

[А]дк = 0,10101                  [D]дк  =   1,01011

                +[В]дк  = 0,01110                  +[E]дк   =   1,10010

[С]дк  = 1,00011                  [F]дк   = 10,11101 –> 0,11101

При виконанні операції додавання з використанням додаткового коду отримуваний знак суми може не відповідати очікуваному, тобто замість знака “плюс” з’являється знак “мінус” або навпаки, як показано в прикладі 5. Тому операцію додавання треба виконувати з використанням модифікованого додаткового коду, в якому під знак числа відводяться два двійкових розряди, причому для зображення знака “плюс” використовується код 00, а для зображення знака “мінус”– код 11.

Відмінність цифр в знакових розрядах, а саме якщо з’являться коди 01 або 10, свідчить про те, що треба виконати модифікацію суми. Для цього отримане число разом із знаковими розрядами зрушують на один розряд вправо, а у звільненому лівому знаковому розряді дублюють значення отриманого після зсуву правого знакового розряду.

    

Приклад 6:

A = +10010 B = +11001

 

[A]мдк = 00,10010

                     +[B]мдк = 00,11001

[C]мдк = 01,01011    –>   00,101011

Перевірка:   100102   –>  1810        110012  –>  2510       1010112    –> 4310

 

 

Приклад 7:

A = –01011 B = –01101

 

[A]мдк = 11,10101

+[B]мдк = 11,10011

[C]мдк = 11,01000   –>  0,10111 + 0,00001 =  0,11000  –>

                             C = –11000

     

 

Перевірка:

10112  –> 1110    11012  –> 1310     110002  –> 2410

Приклади:

+101001 (41) + (+110100 (52)) =  +1011101 (93)

–11001 (–25) + (+01001 (9)) = 11,00111 + 00,01001 =

= 11,10000  –> 0,01111 + 0,00001  –> –10000 (–16)

–00110 (–6) + (+10100 (20))  = 11,11010 + 00,10100 = 100,01110 –>

  00,01110 (14)

4.6. Таким чином, основні правила додавання (віднімання) цілих чисел із знаком можна сформулювати так:

а). Операція віднімання замінюється операцією додавання з від’ємним числом.

б). Доданки повинні мати однакову кількість розрядів. Для вирівнювання розрядних сіток доданків треба дописувати нулі зліва до значущої частини числа.

в). Приписані незначущі нулі змінюють своє значення при перетвореннях кодів за загальними правилами.

г). Знакові розряди чисел враховуються при додаванні нарівні зі значущими розрядами.

д). При появі одиниці переносу із старшого знакового розряду, в разі використання зворотного коду, ця одиниця підсумовується зі значущою частиною числа. При використанні додаткового коду одиниця переносу не враховується.

е). Знак результату формується автоматично.

є). Результат представляється в тому коді, в якому представлені доданки.

 


Перевірка за допомогою демонстраційної програми правильності результатів, отриманих під час виконання індивідуального завдання у відповідності з п.4

5.1. Спочатку треба вручну отримати результати для свого індивідуального завдання і заповнити всі позиції в таблицях 2 і 3, як вказано в п.3.2 для варіанта 30 із таблиці 1.

5.2. Перевірити правильність заповнення всіх клітинок в таблицях 2 і 3 за допомогою демонстраційної програми, текст якої розміщений нижче.

5.3. Демонстраційну програму треба запустити на виконання в одному з середовищ, яке підтримує програмування на мові Pascal.

5.4.  Текст демонстраційної програми.

          

program summirovan;

uses crt;

var

a,b:integer; {Введенные числа}

{Те же числа, но в кодах}

a_pr,b_pr:word;

a_ok,b_ok:word;

a_dk,b_dk:word;

d   :char;

function plusdk(a,b:word):word; {Сложение в дополнительном коде}

var

trans:word; {Бит переноса}

digit:word; {Текущий бит}

result:word; {Для хранения промежуточного результата }

          {при вычислении бита переноса}

c:word; {Сумма}

i:byte; {Счетчик}

begin

trans:=0;

for i:=0 to 7 do begin

digit:=(a and (1 shl i)) xor (b and (1 shl i)) xor (trans shl i);

if digit=0 then c:=c and (255 xor (1 shl i))

else c:=c or (1 shl i);

result:=(a and (1 shl i))and(b and(1 shl i));

result:=result or ((b and(1 shl i))and(trans shl i));

result:=result or ((a and (1 shl i))and(trans shl i));

  if result<>0 then trans:=1 else trans:=0;

end;

plusdk:=c; {Возвращение результата}

end;

function plusok(a,b:word):word; {Сложение в обратном коде}

var

trans,digit,result:word;

c:word;

i:byte;

begin

trans:=0;

for i:=0 to 7 do begin

digit:=(a and (1 shl i)) xor (b and (1 shl i)) xor (trans shl i);

if digit=0 then c:=c and (255 xor (1 shl i))

else c:=c or (1 shl i);

result:=(a and (1 shl i)) and (b and (1 shl i));

result:=result or ((b and (1 shl i))and(trans shl i));

 result:=result or ((a and (1 shl i))and(trans shl i));

if result<>0 then trans:=1 else trans:=0;

end;

if trans=1 then c:=plusok(c,1); {Перенос из знакового разряда }

                             {прибавляется к младшему разряду}

plusok:=c;

end;

function bdtos(a:word):string; {Преобразование битов числа в строку}

var

i:byte;

s:string;

begin

s:='';

for i:=7 downto 0 do

s:=s+chr(ord(((1 shl i) and a)<>0)+48);

bdtos:=s;

end;

function prtoi(a:word):integer; {Преобразование из прямого кода в integer}

begin

if a<127 then prtoi:=a

else prtoi:=-(a and 127);

end;

function itopr(a:integer):word; {Преобразование из integer в прямой код}

begin

if a>=0 then itopr:=a

else itopr:=abs(a) or (1 shl 7);

end;

function prok(a:word):word;{Преобразование из прямого кода в обратный }

                      {и наоборот}

begin

if a<127 then prok:=a

else prok:=(not a) or (1 shl 7);

end;

function prdk(a:word):word; {Преобразование из прямого кода в дополнительный }

                       {и наоборот}

begin

if a<127 then prdk:=a

else prdk:=plusdk((not a) or (1 shl 7),1);

end;

begin

while true do

begin

clrscr;

write('Введите A и B через пробел: ');

readln(a,b);

a_pr:=itopr(a);

b_pr:=itopr(b);

a_ok:=prok(a_pr);

b_ok:=prok(b_pr);

a_dk:=prdk(a_pr);

b_dk:=prdk(b_pr);

writeln(' [A]пк = ',bdtos(a_pr));

writeln(' [B]пк = ',bdtos(b_pr));

writeln(' [A]ок = ',bdtos(a_ok));

writeln(' [B]ок = ',bdtos(b_ok));

writeln(' [A]дк = ',bdtos(a_dk));

writeln(' [B]дк = ',bdtos(b_dk));

writeln('Результат в обратном коде:');

writeln(' [A]oк+[B]oк = ',bdtos(plusok(a_ok,b_ok)));

writeln('Результат в дополнительном коде:');

writeln(' [A]дк+[B]дк = ',bdtos(plusdk(a_dk,b_dk)));

write('Результат в прямом коде:');

writeln(bdtos(prdk(plusdk(a_dk,b_dk))));

writeln('Результат в 10-м коде:');

writeln(' [A]дес+[B]дес = ',prtoi(prdk(plusdk(a_dk,b_dk))));

gotoxy(30,25);

textcolor(15);

writeln('Нажмите: Enter - чтобы продолжить и ');

write('                                1 - чтобы выйти');

d:=readkey;

if (d='1') then halt;

 end;

end.

 

Контрольні запитання

 

6.1. Скільки бітів в одному та двох байтах?

6.2. Чи відрізняються прямий, зворотний і додатковий коди у додатного та у від’ємного числа?

6.3. Враховується чи ні одиниця переносу із старшого знакового розряду при використанні кодів зворотного та додаткового під час виконання операції додавання?

6.4. В чому особливість модифікованих кодів?

6.5. Що треба виконати, якщо в знакових розрядах при використанні модифікованих кодів під час виконання операції додавання з’являється значення 01 або 10?

 

Зміст звіту

 

7.1. Звіт треба оформити в зошиті для звітів або на аркушах формату А4.

7.2. Звіт може бути роздрукований.

7.3. При оформленні звіту треба використати українську мову.

7.4. В звіті мають бути вказані:

1) номер лабораторної роботи;

2) тема лабораторної роботи;

3) мета її виконання;

4) індивідуальне завдання;

5) результати виконання індивідуального завдання;

6) особливості функціонування демонстраційної програми і результати, отримані при її виконанні;

7) відповіді на контрольні запитання;

8) висновки по даній лабораторній роботі.










Последнее изменение этой страницы: 2018-04-12; просмотров: 172.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...