при умножении двух 16-битных данных со знаком на размер полученного результата? - PullRequest
5 голосов
/ 25 сентября 2011

Я столкнулся с вопросом об интервью, связанным со встроенными системами и C / C ++.Вопрос в следующем:

Если мы умножим 16-битные данные с 2 знаками (дополнением 2), каким должен быть размер результирующих данных?

Я уже пыталсяэто пример умножения двух знаковых 4-битных, поэтому, если мы умножим +7 и -7, мы получим -49, что требует 7 бит.Но я не мог сформулировать общее отношение.

Я думаю, мне нужно глубоко разбираться в двоичном умножении, чтобы решить этот вопрос.

Ответы [ 2 ]

7 голосов
/ 25 сентября 2011

Во-первых, целое число со знаком n битов содержит значение в диапазоне - (2 ^ (n-1)) .. + (2 ^ (n-1)) - 1.Например, для n = 4 диапазон составляет - (2 ^ 3) .. (2 ^ 3) -1 = -8 .. + 7

Диапазон результата умножения равен -8 * +7 .. -8 * -8 = -56 .. + 64.

+ 64 больше, чем 2 ^ 6-1 - это 2 ^ 6 = 2 ^ (2n-2)!Вам понадобится 2n-1 бит для хранения такого ПОЗИТИВНОГО целого числа.

Если вы не используете проприетарное кодирование (см. Следующий параграф) - вам понадобится 2n бит: один бит для знака и 2n-1биты для абсолютного значения результата умножения.

Если M является результатом умножения, вы можете сохранить -M или M-1.это может сэкономить вам 1 бит.

3 голосов
/ 25 сентября 2011

Это будет зависеть от контекста. В C / C ++ все промежуточные продукты, меньшие int, повышаются до int. Поэтому, если int больше 16-битного, то результатом будет 32-битное целое число со знаком.

Однако, если вы присваиваете его 16-битному целому числу, оно усекается, оставляя только младшие 16 битов дополнения двух нового числа.

Таким образом, если ваше определение «результата» является промежуточным, сразу же после умножения, тогда ответ имеет размер int. Если вы определите размер, как после того, как вы сохранили его обратно в 16-битную переменную, тогда ответом будет размер 16-битного целочисленного типа.

...