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

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

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

 

Мета роботи

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

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

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

 

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

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

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

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

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

  Таблиця 3.1 – Індивідуальні завдання Варіант X … 3.3.2.Для свого варіанта вручну отримати коди десятковий, двійковий, прямий, зворотний та додатковий для +X, –X, +Y і…

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

  Таблиця 3.4 – Правила додавання двійкових цифр Значення i-х…  

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

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

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

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

3.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.

 

Зміст звіту

3.6.2. Звіт може бути роздрукований. 3.6.3. Звіт виконують українською мовою. 3.6.4. У звіті мають бути вказані:

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

2. Чи відрізняються прямий, зворотний і додатковий коди у додатного та у від’ємного числа? 3. Враховується чи ні одиниця переносу із старшого знакового розряду при… 4. У чому особливість модифікованих кодів?