Постановка задачи
Реализовать 16-разрядный сумматор чисел со знаком на основе разработанных в первой лабораторной работе функций. Используя тот же язык программирования, что и в первой лабораторной работе. Суммирование разрядов выполнить в порядке LSF. Сформировать признак переполнения по рассмотренным на лекциях правилам.
Реализация
В соответствии с условиями задачи:
1. реализованы переводы в двоичную и десятичную системы;
2. реализованы базовые логические операции (конъюнкция, дизъюнкция, сложение по модулю два);
3. разработан шестнадцати разрядный сумматор и функция, отслеживающая переполнение.
Исходный код
//LABA#2
//Неверовская В.А; Группа 6О-209Б; Вариант №20
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
short int otrizanie(short int key);
short int diz(short int key, short int key2);
short int con(short int key, short int key2);
short int slozh(short int key, short int key2);
// перевод в двоичную систему
short int perevod_v_2(short int a, short int *b);
// перевод в десятичную систему
short int perevod_v_10(short int s, short int b[]);
// однорозрядный сумматор
|
|
short int summator1(short int slagaemoe1,short int slagaemoe2,short int perenos[]);
// шестнадцатиразрядный сумматор
short int summator16(short int *b, short int *c, short int *x);
// функция отслеживающая переполнение
short int Perepolnenie(short int *b, short int *c, short int v);
int main()
{
// массивы в которых будут храниться записи
// двух чисел и их суммы
short int b[16];
short int c[16];
short int x[16];
short int per;
// переменные a,z - два числа поступающих на вход,
// s - для возвращения из двоичной системы в десятичную чисел
short int a,z,i,s;
s=0;
// инициализируем первое число
a=2000;
// инициализируем второе число
z=-25000;
perevod_v_2(a,b);
for (i=0; i!=16; i++)
printf("%d", b[i]);
printf("\n");
s=perevod_v_10(s,b);
printf("%d\n", s);
printf("+\n");
perevod_v_2(z,c);
for (i=0; i!=16; i++)
printf("%d", c[i]);
printf("\n");
s=perevod_v_10(s,c);
printf("%d\n", s);
printf("_______________________\n");
// складываем шестнадцатиразрядным сумматором данные числа
per=summator16(b,c,x);
for (i=0; i!=16; i++)
printf("%d", x[i]);
s=perevod_v_10(s,x);
printf("\n");
printf("%d\n", s);
// отслеживаем было ли переполнение
Perepolnenie(b,c,per);
}
//Создание функции отрицания
short int otrizanie(short int key){
if ((key%2)!=0){
return 0;}
else{
return 1;}
}
//Создание функции дизъюнкции
short int diz(short int key,short int key2){
short int s;
s=0;
if ((key%2)!=0){
s=1;
goto exit1;}
else{
s=0;}
if ((key2%2)!=0){
s=1;
goto exit1;}
else{
s=0;}
exit1:
return s; }
// Создание функции конъюнкции
short int con(short int key,short int key2){
short int s;
s=0;
if ((key%2)!=0){
s=1;}
else{
s=0;
goto exit1;}
if ((key2%2)!=0){
s=1;
}
else{
s=0;
goto exit1;}
exit1:
return s; }
//Создание функции сложения по модулю два
short int slozh(short int key, short int key2){
int d=0;
if (key%2!=0){
d++;}
if (key2%2!=0){
d++;}
if (d==1){
return 1;}
else{
return 0;}
}
|
|
short int perevod_v_2(short int a, short int *b)
{
short int m[16];
int i,z,v1,v,p;
// возводим 2 в 15 степень
p=1<<15;
// если число отрицательно то знаковый разряд равен 1
if (a<0)
{
b[0]=1;
a=p+a;
}
else
b[0]=0;
// переводим число из 10 в 2
for (i=0;a!=0;i++)
{
m[i]=a%2;
if (m[i]==1)
a=(a-1)/2;
else
a=a/2;
}
z=1;
v=i;
v1=16-i;
// заполняем массив до 16 символов
while (z!=v1)
b[z++]=0;
// делаем так чтобы начало массива было началом числа
for (z=v1;z!=16;z++)
b[z]=m[--v];
}
short int perevod_v_10(short int s, short int b[])
{
int r,i,p,q,qq;
int h[16];
short int ww[16];
p=1<<15;
r=1;
i=15;
s=0;
q=0;
qq=0;
ww[0]=0;
for (i=0; i!=16; i++)
h[i]=b[i];
// переводим число в десятичную систему
i=15;
while (i!=0)
{
s=h[i]*r+s;
r=r*2;
i--;
}
if (b[0]==1){
s=s-p;}
return s;
}
// суммируем все 16 разрядов
short int summator16(short int *b, short int *c, short int *x)
{
short int perenos;
perenos=0;
int i;
for (i=15; i>=0; i--)
x[i]=summator1(b[i],c[i],&perenos);
return x[0];
}
// суммируем по схеме сумматора
short int summator1(short int slagaemoe1, short int slagaemoe2, short int perenos[])
{
short int w;
short int r;
short int t;
short int summa;
w = slozh(slagaemoe1,slagaemoe2);
summa = slozh(*perenos,w);
r = con(slagaemoe1,slagaemoe2);
t = con(*perenos,w);
* perenos = diz(r,t);
return summa;
}
// функция отслеживающая переполнение
short int Perepolnenie(short int *b, short int *c, short int perenos1)
{
if ((b[0]==c[0])&&(perenos1!=b[0]))
printf("\nPerepolnenie - YES\n\n");
else
printf("\nPerepolnenie - NO\n\n");
}
Тестирование
Выводы
В соответствии условиям задачи был разработан 16-разрядный сумматор чисел со знаком на основе разработанных в первой лабораторной работе функций. Так же была реализована функция переполнения. Добавлены базовые логические операции с первой работы. Результатом данной работы можно назвать получившиеся в ходе суммирования в двоичной системе различные/одинаковые по знаку числа.