2011-09-25 6 views
5

Mam do czynienia z pytaniem do wywiadu dotyczącym systemów wbudowanych i C/C++. Pytanie brzmi:kiedy dwa 16-bitowe dane z podpisem są mnożone, jaki powinien być rozmiar wypadkowej?

Jeśli pomnożymy 2 16-bitowe dane z podpisem (2-częściowym), jaka powinna być wielkość danych wynikowych?

zacząłem próbując go na przykładzie mnożąc dwa podpisał 4-bitowy, więc, jeśli pomnożymy +7 i -7, możemy skończyć z -49, która wymaga 7 bitów. Ale nie mogłem sformułować ogólnej relacji.

Myślę, że muszę zrozumieć binarnie mnożyć się głęboko, aby rozwiązać to pytanie.

Odpowiedz

3

To będzie zależeć od kontekstu. W C/C++, wszystkie związki pośrednie mniejsze niż int są promowane do int. Więc jeśli int jest większa niż 16-bitów, wynikiem będzie 32-bitowa liczba całkowita ze znakiem.

Jeśli jednak przypiszesz ją do 16-bitowej liczby całkowitej, zostanie ona obcięta, pozostawiając tylko dolne 16 bitów uzupełnienia dwójki nowego numeru.

Więc jeśli twoja definicja "wyniku" jest pośrednią bezpośrednio po mnożeniu, to odpowiedź ma rozmiar int. Jeśli określisz rozmiar tak, jak po zapisaniu go z powrotem do 16-bitowej zmiennej, wówczas odpowiedź jest równa 16-bitowemu typowi całkowitemu.

+0

To pytanie jest niezależne od języka, ale jest przydatne dla programistów C i C++. –

7

Po pierwsze, liczba małych bitów ze znakiem n zawiera wartość w zakresie - (2^(n-1)) .. + (2^(n-1)) - 1. Na przykład dla n = 4 zakres wynosi - (2^3) .. (2^3) -1 = -8 .. + 7

Zakres wyniku mnożenia wynosi -8 * + 7 .. -8 * -8 = -56 .. + 64.

+64 jest więcej niż 2^6-1 - to 2^6 = 2^(2n-2)! Będziesz potrzebował 2n-1 bitów do przechowywania takiej DODATNIEJ liczby całkowitej.

Jeśli nie używasz kodowania własnościowego (patrz następny akapit) - potrzebujesz 2n bitów: Jeden bit do znaku, a 2n-1 do bezwzględnej wartości wyniku mnożenia.

Jeśli M jest wynikiem mnożenia, można zamiast tego zapisać -M lub M-1. to może zaoszczędzić 1 bit.

Powiązane problemy