Как процессор умножает целые числа, окончание
Конечно, умножение через сдвиг (так называется дописывание нуликов справа) и дальнейшее сложение/вычитание -- это всё равно муторно. Так считали первые процессоры, у которых не было достаточного количества памяти, чтобы хранить промежуточные результаты.
Современные процессоры умножают точно так же, как мы с вами умножаем длинные числа -- в столбик. В двоичной системе это просто -- можно использовать обыкновенную логический элемент типа AND. Получаются промежуточные результаты, количество которых равно битности умножаемых чисел. Когда все их сложить, получается результат, битность которого в два раза больше битности множителей.
Что делать с левой частью? В принципе, в ней должны быть одни нули, и её можно смело отрезать. Если там не нули, значит, получилось число, которое больше максимального числа, которые мы можем представить в нашем процессоре, с заданной битностью. Так, если у нас 16 бит на число, максимальное число, которое мы можем представить -- 65 535 (если нас интересует работа только с положительными числами). Если же у нас в левой части получились единички, значит, наш результат больше, чем числа, с которыми мы можем работать. Обычно при таких результатах внутри процессора ставится какой-либо статусный флаг, сигнализирующим о переполнении. Задача программиста -- спросить у процессора, "а нормально ли умножилось?" Если не спросить -- то не удивляйтесь, если 35 000 * 2 = 4 464.
Современные процессоры умножают точно так же, как мы с вами умножаем длинные числа -- в столбик. В двоичной системе это просто -- можно использовать обыкновенную логический элемент типа AND. Получаются промежуточные результаты, количество которых равно битности умножаемых чисел. Когда все их сложить, получается результат, битность которого в два раза больше битности множителей.
Что делать с левой частью? В принципе, в ней должны быть одни нули, и её можно смело отрезать. Если там не нули, значит, получилось число, которое больше максимального числа, которые мы можем представить в нашем процессоре, с заданной битностью. Так, если у нас 16 бит на число, максимальное число, которое мы можем представить -- 65 535 (если нас интересует работа только с положительными числами). Если же у нас в левой части получились единички, значит, наш результат больше, чем числа, с которыми мы можем работать. Обычно при таких результатах внутри процессора ставится какой-либо статусный флаг, сигнализирующим о переполнении. Задача программиста -- спросить у процессора, "а нормально ли умножилось?" Если не спросить -- то не удивляйтесь, если 35 000 * 2 = 4 464.