Дано:
Множитель (A): 1.011110 (это число -66 в дополнительном коде)
Множимое (B): 0.1000111 (это число 71 в дополнительном коде)
Понимание формата чисел:
Цифра до запятой — это знаковый разряд. Значит, запятая разделяет знаковый бит и остальные разряды.
Числа представлены в 8-битном формате (1 знаковый бит + 7 битов данных).
Шаг 1: Приведение чисел к двоичному виду без разделителя для удобства работы.
Число A (-66):
1.011110 --> 10111110
Число B (71):
0.1000111 --> 01000111
Шаг 2: Проверка чисел и их соответствия десятичным значениям.
Для A:
Поскольку знаковый бит равен 1, число отрицательное.
Находим модуль числа:
Инвертируем биты (кроме знакового): 0111110 --> 1000001
Добавляем 1: 1000001 + 1 = 1000010
Десятичное значение: 66
Значит, число A = -66
Для B:
Знаковый бит равен 0, число положительное.
Десятичное значение:
1000111
Десятичное значение: 64 + 4 + 2 + 1 = 71
Шаг 3: Подготовка к умножению.
Нам нужно умножить -66 на 71.
Шаг 4: Расширение чисел до 16 бит для корректной обработки переполнения.
Расширяем число A до 16 бит с учетом знакового расширения:
10111110 --> 11111111 10111110
Число B остается как есть, но для умножения нам понадобятся его биты:
01000111
Шаг 5: Выполнение умножения с использованием сдвигов и сложения.
Представляем множитель B по битам (от младшего к старшему):
Бит 0 (LSB): 1
Бит 1: 1
Бит 2: 1
Бит 3: 0
Бит 4: 0
Бит 5: 0
Бит 6: 1
Бит 7 (MSB): 0
Процесс умножения:
Для каждого бита множителя B:
Если бит равен 1, добавляем к аккумулятору множимое A, сдвинутое влево на позицию этого бита.
Используем знаковое расширение при сдвиге множимого A.
Шаги сложения:
Бит 0 (позиция 0):
Бит равен 1.
Сдвиг A на 0 позиций: 11111111 10111110
Аккумулятор: 0 + 11111111 10111110 = 11111111 10111110
Бит 1 (позиция 1):
Бит равен 1.
Сдвиг A на 1 позицию: 11111111 01111100
Аккумулятор: 11111111 10111110 + 11111111 01111100
Бит 2 (позиция 2):
Бит равен 1.
Сдвиг A на 2 позиции: 11111110 11111000
Аккумулятор: сумма предыдущего результата и текущего сдвига.
Биты 3-5:
Биты равны 0.
Пропускаем эти шаги.
Бит 6 (позиция 6):
Бит равен 1.
Сдвиг A на 6 позиций: 11111110 00000000
Аккумулятор: добавляем к предыдущему результату.
Шаг 6: Подсчет итогового значения аккумулятора.
После выполнения всех сложений получаем итоговый аккумулятор.
Поскольку все операции выполнялись с учетом знака, итоговое значение будет корректным.
Шаг 7: Получение окончательного результата и проверка.
Итоговое значение аккумулятора представляет произведение -66 * 71.
Вычисляем произведение в десятичной системе для проверки:
-66 * 71 = -4686
Преобразуем двоичный результат аккумулятора в десятичное число и убеждаемся, что оно равно -4686.
Заключение:
Мы успешно умножили два числа в дополнительных кодах с использованием сдвигов и сложения.
Итоговое произведение: -4686