#include <iostream> #include <iomanip> using namespace std;
// перевод из основания frm в основание 10 void snd(int frm,int* n,char s[]) { int m,p; m=strlen(s); if (m>0) { if (s[m-1]<58) p=s[m-1]-48; else p=s[m-1]-'a'+10; s[m-1]=0; snd(frm,n,s); } else p=0; *n=*n*frm+p; }
// перевод числа n из основания 10 в to void dsn(int* n,int to,char s[]) { static int k=0; int m; m=*n%to; *n/=to; k++; if (*n>0) dsn(n,to,s); else { s[k]=0; k=0; } if (m<10) s[k]=m+48; else s[k]=m+'a'-10; k++; }
Для перевода чисел в дополнительный код, нужно: 1) перевести в двоичную систему счисления 0000 1101 13 0000 0111 7 2) инвертировать (заменить 0 на 1 и наоборот) 1111 0010 1111 1000 3) и прибавить 1 1111 0011 1111 1001 все) числа в дополнительном коде мы получили
теперь сложение: 1111 0011 1111 1001 + 1 1110 1100 мы получили переполнение и единицу в старшем разряде, это значит, сумма будет со знаком минус теперь переведем сумму в обычный код, не трогаем старший бит 1) _001 0011 инвертируем биты 2) _001 0100 прибавим 1 3) переводим в десятичную систему счисления: 20
вспоминаем, что сумма отрицательная, поэтому ответ будет: -20 ------------ для положительных чисел нужно перевести в двоичную систему Например: 2 + 3 0000 0010 - 2 0000 0011 - 3 и сложить 0000 0101 - = 2 + 4 = 6 у положительных дополнительный код совпадает с прямым кодом
N=8 в задании, насколько я понимаю, означает решение для восьмибитного представления данных, т.е. для случай, когда левый бит отводится под знак (0 - плюс, 1 - минус), а семь правых битов используются для представления числа. Отрицательное число представляется в дополнительном коде, т.е. нули заменяются единицами (и единицы - нулями), а потом в младшем разряде к полученному числу прибавляется единица. Вначале перевод. -13(10)=-0001101(2) Инвертируем биты: 1110010 Прибавляем единицу: 1110011 И дописываем слева 1 в качестве знака. 1 1110011 Аналогичным образом поступаем и с числом -7: -7(10)=-0000111(2) Инвертируем биты: 1111000 Прибавляем единицу: 1111001 И дописываем слева 1 в качестве знака. 1 1111001 Теперь сложение. Выполняем его в столбик для всех восьми бит. 11110011 + 11111001
11101100 У нас при сложении появилась единица переноса из левого разряда, но дальше уже разрядов нет и она просто отбрасывается. Результат получился с единичным знаковым разрядом. Поэтому для получения величины результата поступаем в обратном порядке: отделяем семь правых бит, вычитаем единицу и снова инвертируем полученное значение. Вместо единичного знакового разряда приписываем числу знак минус. 1101100 - 1 = 1101011. Инверсия: 0010100, результат -10100(2)=-20(10)
#include <iomanip>
using namespace std;
// перевод из основания frm в основание 10
void snd(int frm,int* n,char s[]) {
int m,p;
m=strlen(s);
if (m>0) {
if (s[m-1]<58) p=s[m-1]-48;
else p=s[m-1]-'a'+10;
s[m-1]=0; snd(frm,n,s);
}
else p=0;
*n=*n*frm+p;
}
// перевод числа n из основания 10 в to
void dsn(int* n,int to,char s[]) {
static int k=0;
int m;
m=*n%to; *n/=to; k++;
if (*n>0) dsn(n,to,s);
else { s[k]=0; k=0; }
if (m<10) s[k]=m+48;
else s[k]=m+'a'-10;
k++;
}
int main() {
int osns,osnd;
int n=0;
char s[30];
cout<<"from osn: "; cin>>osns;
cout<<"number: "; cin>>s;
cout<<"to osn: "; cin>>osnd;
snd(osns,&n,s);
dsn(&n,osnd,s);
cout<<s<<endl;
system("pause");
return 0;
}
from osn: 5
number: 13211
to osn: 16
420
from osn: 16
number: 2f3de
no osn: 6
4051502