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

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

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

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

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

Как их сложить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2012, 17:19
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

Итак. переводим 201:
Code
1
2
3
4
5
6
7
8
9
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:
Целая честь:
Code
1
2
3
4
5
6
7
8
9
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.

Дробная часть:
Code
1
2
3
4
5
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 какое-то число, переводим из двоичной формы в десятичную:

Целая часть:
Code
1
2
3
1011/1010 1
0001/1010 1
0000
Целая часть 10112=1110

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.12.2012, 05:38
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Исключения в Java: советы, примеры кода и многое другое
Javaican 18.05.2025
Исключения — это объекты, созданные когда программа сталкивается с непредвиденной ситуацией: файл не найден, сетевое соединение разорвано, деление на ноль. . . Список можно продолжать до бесконечности. . . .
Как сделать SSO (Single Sign-On) в C# приложении
stackOverflow 18.05.2025
SSO — это механизм, позволяющий пользователю пройти аутентификацию один раз и получить доступ к нескольким приложениям без повторного ввода учетных данных. Вы наверняка сталкивались с ним, когда. . .
Kubernetes с Apache Flink для обработки данных в реальном времени
Mr. Docker 17.05.2025
Kubernetes — это целая философия управления распределёнными приложениями. В отличие от "примитивных" решений вроде Docker Swarm, K8s (как его ласково называют в тусовке DevOps-инженеров) предлагает. . .
Использование декораторов в Python
py-thonny 17.05.2025
Если вы когда-нибудь задумывались о том, как красиво расширить функциональность кода без лишней возни и дублирования, декораторы в Python — та самая волшебная палочка, которую вы искали. По сути, это. . .
Реализация многопоточных сетевых серверов на Python
py-thonny 16.05.2025
Когда сталкиваешься с необходимостью писать высоконагруженные сетевые сервисы, выбор технологии имеет критическое значение. Python, со своей элегантностью и высоким уровнем абстракции, может. . .
C# и IoT: разработка Edge приложений с .NET и Azure IoT
UnmanagedCoder 16.05.2025
Мир меняется прямо на наших глазах, и интернет вещей (IoT) — один из главных катализаторов этих перемен. Если всего десять лет назад концепция "умных" устройств вызывала скептические улыбки, то. . .
Гибридные квантово-классические вычисления: Примеры оптимизации
EggHead 16.05.2025
Гибридные квантово-классические вычисления — это настоящий прорыв в подходах к решению сложнейших вычислительных задач. Представьте себе союз двух разных миров: классические компьютеры, с их. . .
Использование вебсокетов в приложениях Java с Netty
Javaican 16.05.2025
HTTP, краеугольный камень интернета, изначально был спроектирован для передачи гипертекста с минимальной интерактивностью. Его главный недостаток в контексте современных приложений — это. . .
Реализация операторов Kubernetes
Mr. Docker 16.05.2025
Концепция операторов Kubernetes зародилась в недрах компании CoreOS (позже купленной Red Hat), когда команда инженеров искала способ автоматизировать управление распределёнными базами данных в. . .
Отражение в C# и динамическое управление типами
stackOverflow 16.05.2025
Reflection API в . NET — это набор классов и интерфейсов в пространстве имён System. Reflection, который позволяет исследовать и манипулировать типами, методами, свойствами и другими элементами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru