12 / 12 / 4
Регистрация: 13.10.2012
Сообщений: 279
1

Сложение двоичных чисел в дополнительном коде

04.12.2012, 17:19. Показов 15758. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
-201 + 189.8

Перевел в двоичный код, получается:
111001001 + 010111101.11001100

Как их сложить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2012, 17:19
Ответы с готовыми решениями:

Сложение чисел в дополнительном коде
Добрый вечер. Помогите доказать, что сумма дополнительных кодов чисел есть дополнительный код...

Сложение/Вычитание в дополнительном коде двоичные числа с плавающей запятой
0.1010011,100000 и 1.111010,010001 сложить и вычесть в допольнительном коде x+y x-y -x+y -x-y

Сложение двоичных чисел с фиксированной запятой
Подскажите как складывать два двоичных числа с фиксированной запятой при переполнении дробной...

Сложение двоичных чисел с плавающей точкой
Здравствуйте! Помогите разобраться. У меня такое задание: для чисел a=3,625 и b=-2,125 посчитать...

1
Модератор
9905 / 5263 / 3318
Регистрация: 17.08.2012
Сообщений: 16,084
06.12.2012, 05:38 2
Перевод неверный. Разряды не с той стороны переписал в целой части. Дробная часть верно, там бесконечная периодическая дробь.

Для перевода из одной системы (исходной) в другую (целевую) систему счисления надо просто разделить целю часть числа на основание системы счисления нацело, пока делится, и "собрать" остатки от деления начиная с последнего, а дробную - умножить на основание системы счисления и собрать получившиеся переполнения (целые части), начиная с первого. Делить и умножать надо по правилам исходной системы счисления; естественно, основание целевой системы счисления необходимо представлять как число исходной системы счисления, а результат - в целевой системе счисления.

Дополнительный код имеет смысл только в числах с фиксированной разрядностью. Самый старший разряд числа в этом случае представляет из себя знак числа. Ноль - число положительное, единица - отрицательное.

Положительное число в дополнительном коде (если, конечно, оно помещается в фиксированное число разрядов минус один разряд на знак) записывается точно так же, как и в прямом коде.

Дополнительный код отрицательного числа можно получить двумя способами:
1) проинвертировать все разряды модуля числа и сложить его с положительным числом, у которого только самый младший разряд равен 1, перенос из старшего разряда не сохранять;
2) вычесть из нуля модуль этого отрицательного числа, заём из самого старшего разряда не сохранять.

Видно, что челые части Ваших чисел не помещаются в один байт (-128..+127). Следовательно, под целую часть необходимо использовать минимум два байта, либо такое количество разрядов, чтобы в них помещались любое из этих чисел и результат. В Вашем случае достаточно 9 битов под целую часть, а под дробную часть - в зависимости от ошибки округления. Для представления с точностью до одного десятичного разряда после десятичной точки достаточно 5 битов после двоичной точки, а с точностью до двух десятичных разрядов - 8 битов. Кстати, почему?

Я бы предложил использовать двоичные числа с фиксированной точкой и отвести два байта под целую часть и два байта под дробную часть.

Итак. переводим 201:
Код
201/2 1
100/2 0
 50/2 0
 25/2 1
 12/2 0
  6/2 0
  3/2 1
  1/2 1
  0
Собираем остатки, начиная с последнего (т. е. со строки 8 до строки 1, СНИЗУ ВВЕРХ): Целая часть числа 20110 = 110010012. Дробная часть числа = 0. Переписываем в формат с фиксированной двоичной точкой (пробелы - для удобства чтения) и переводим в дополнительный код (ну, так, для примера, двумя способами):

0000 0000 1100 1001.0000 0000 0000 0000 это +201
1111 1111 0011 0110.1111 1111 1111 1111 инверсия
+
0000 0000 0000 0000.0000 0000 0000 0001 + вот это, перенос последний - не учитываем
---------------------------------------
1111 1111 0011 0111.0000 0000 0000 0000 дополнительный код



0000 0000 0000 0000.0000 0000 0000 0000 ноль
-
0000 0000 1100 1001.0000 0000 0000 0000 вычитаем 201, о заёме из несуществующего разряда забываем
---------------------------------------
1111 1111 0011 0111.0000 0000 0000 0000 дополнительный код

Проверяем.
1111 1111 0011 0111.0000 0000 0000 0000 это -201 в доп. коде
0000 0000 1100 1001.0000 0000 0000 0000 это +201, складываем, перенос последний - игнорируем
0000 0000 0000 0000.0000 0000 0000 0000 ясен пень, (-201)+(+201)=0, значит, всё правильно.

Теперь переводим 189.8:
Целая честь:
Код
189/2 1
 94/2 0
 47/2 1
 23/2 1
 11/2 1
  5/2 1
  2/2 0
  1/2 1
  0
Получаем 18910 = 101111012.

Дробная часть:
Код
0.8*2 1.6 1
0.6*2 1.2 1
0.2*2 0.4 0
0.4*2 0.8 0
0.8
В последней строке получилось 0.8, это число было в первой строке. Получилась бесконечная двоичная дробь, т. е. число 0.810 в двоичной форме ограниченным количеством разрядов точно не выражается, возможно только приближение. Всё равно пишем. Переполнения записываем СВЕРХУ ВНИЗ. 0.810 = 0.(1100). Скобки обозначают периодичность дроби.
Складываем целую и дробную часть. Получаем: 189.810 = 10111101.(1100)2. Переписываем в нашем формате, округляем:

0000 0000 1011 1101.1100 1100 1100 1100

Осталось сложить.

1111 1111 0011 0111.0000 0000 0000 0000 это -201
+
0000 0000 1011 1101.1100 1100 1100 1100 это примерно 189.8
---------------------------------------
1111 1111 1111 0100.1100 1100 1100 1100 сумма.

Проверяем. Переводим из дополнительного кода в подожительное число:
0000 0000 0000 0000.0000 0000 0000 0000 это ноль
-
1111 1111 1111 0100.1100 1100 1100 1100 вычитаем сумму из нуля, заём - в пропасть
---------------------------------------
0000 0000 0000 1011.0011 0011 0011 0100 какое-то число, переводим из двоичной формы в десятичную:

Целая часть:
Код
1011/1010 1
0001/1010 1
0000
Целая часть 10112=1110

Дробная часть:

Код
0.0011 0011 0011 0100*1010  10.0000 0000 0000 1000 2
0.0000 0000 0000 0100*1010   0.0000 0000 0101 0000 0
0.0000 0000 0010 1000*1010   0.0000 0011 0010 0000 0
0.0000 0001 1001 0000*1010   0.0001 1111 0100 0000 0
0.0000 1111 1010 0000*1010   1.0011 1000 1000 0000 1
0.0011 1000 1000 0000*1010  10.0011 0101 0000 0000 2
0.0011 0101 0000 0000*1010   0.0110 1010 0000 0000 0
0.0110 1010 0000 0000*1010 100.0010 0100 0000 0000 4
0.0010 0100 0000 0000*1010   1.0110 1000 0000 0000 1
0.0110 1000 0000 0000*1010 100.0001 0000 0000 0000 4
0.0001 0000 0000 0000*1010   0.1010 0000 0000 0000 0
0.1010 0000 0000 0000*1010 110.0100 0000 0000 0000 6
0.0100 0000 0000 0000*1010  10.1000 0000 0000 0000 2
0.1000 0000 0000 0000*1010 101.0000 0000 0000 0000 5
0.0000 0000 0000 0000*1010   0.0000 0000 0000 0000 0
Дробная часть 0.0011 0011 0011 01002=0.20001204140625010. Причём перевелось точно.
Вообще-то достаточно было перевести с точностью до второго знака и округлить.

Складываем целую и дробную часть: 11.200012041406250.
Вообще-то должно было получиться 11.2, но ничего, это тоже очень похоже на правду. Неточность возникла из-за ошибки округления.

Вот, в кратце, и всё решение.

Совет на будующее: пытайтесь понять в первую очередь принцип, чтобы потом всегда можно было понять какой-либо частный случай. Задание, вообще-то, простенькое.

Всего Вам доброго.


Добавлено через 11 минут
Ой, зря я так нехорошо о переводе... Перевели Вы всё правильно, только первое число почему-то не представили в дополнительном коде, а приписали ему знак спереди (1).
1
06.12.2012, 05:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2012, 05:38
Помогаю со студенческими работами здесь

Сложение двоичных чисел в дополнительном коде
Пожалуйста, помогите сложить десятичные числа -10.49 и -13.31, перевдя их в двоичную систему....

Сложение (вычитание) двоичных чисел в дополнительном коде
Сложение (вычитание) двоичных чисел в дополнительном коде.Можно не писать нахождение...

Сложение (вычитание) двоичных чисел в дополнительном коде
Сложение (вычитание) двоичных чисел в дополнительном коде и сделать проверку введенных чисел....

Умножение двоичных чисел в дополнительном коде
Нужно написать программу для умножения двоичных чисел в дополнительном коде, чтобы каждое действие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru