Reprezentacja liczb całkowitych
Transkrypt
Reprezentacja liczb całkowitych
Reprezentacja liczb całkowitych ✦ Komputer działa na ciągach binarnych: dla reprezentowania liczb mamy więc do dyspozycji jedynie 0, 1, znak minus i przecinek ✦ np. –1011,01012 = – 11,312510 ✦ Jednak podczas przechowywania liczb nie możemy używać znaków minusa i przecinka ✦ Dla liczb naturalnych reprezentacja liczb jest prosta ✦ np. 41=00101001 ✦ Reprezentacje liczb ujemnych ✦ znak-moduł (ang. sign-magnitude) ✦ uzupełnienia do dwóch (ang. two’s compliment) Reprezentacja znak-moduł ✦ Do reprezentowania liczb ujemnych wykorzystuje się lewy skrajny bit słowa (ang. LSB) ✦ 0 oznacza liczbę dodatnią ✦ 1 oznacza liczbę ujemną ✦ np. +18 = 00010010 ✦ np. -18 = 10010010 ✦ Problemy ✦ do realizacji działań arytmetycznych wymagane są zarówno znaki liczb jak ich moduły ✦ zero ma dwie reprezentacje 0 = 00000000 i –0 = 1000000 Reprezentacja uzupełnienia do dwóch ✦ reprezentacja U2 albo dopełnieniowa ✦ negujemy bity liczby bez znaku i dodajemy 1 ✦ np. –3 = 11111101 ✦ 3 = 00000011 ✦ negowanie 11111100 ✦ dodanie jedynki 11111101 ✦ np. 23 = 17h = 00010111 stąd –23=11101001=E9h ✦ ........... +3 = 00000011; +2 = 00000010; +1 = 00000001; +0 = 00000000; -1 = 11111111; -2 = 11111110; -3 = 11111101; .......... ✦ Korzyści ✦ łatwo jest zrealizować arytmetykę (za pomocą układów cyfrowych) ✦ negowanie liczby jest łatwe (w układach cyfrowych) U2 - opis geometryczny Negowanie zera ✦ 0= 00000000 ✦ Negowanie 11111111 ✦ Dodanie jedynki +1 ✦ Wynik 1 00000000 ✦ Przepełnienie (ang. overflow) jest ignorowane ✦- 0 = 0 √ ✦ Jedna reprezentacja dla zera Negowanie -128 ✦ -128 = 10000000 ✦ Negowanie 01111111 ✦ Dodanie jedynki +1 ✦ Wynik 10000000 ✦ Stąd mamy anomalię: -(-128) = -128 ✦ Bit znaku musi ulegać zmianie podczas negacji Zakres liczb ✦ U2 - 8 bitów ✦ +127 = 01111111 = 27 -1 ✦ -128 = 10000000 = -27 ✦ U2 - 16 bitów ✦ +32767 = 011111111 11111111 = 215 - 1 ✦ -32768 = 100000000 00000000 = -215 Kowersja między różnymi długościami bitowymi ✦ Przesunięcie bitu znaku do najdalszej lewej pozycji oraz wypełnienie pozostałych wolnych pozycji kopiami bitu znaku ✦ +18 = 00010010 (8 bitów) ✦ +18 = 00000000 00010010 (16 bitów) ✦ -18 = 11101110 (8 bitów) ✦ -18 = 11111111 11101110 (16 bitów) ✦ Udowodnić poprawność tej zasady Dodawanie i odejmowanie ✦ Zwykłe operacje jak bez znaku, ignorowanie bitu przeniesienia ✦ Może powstać przepełnienie (ang. overflow) ✦ np. -7 + -6 = 1001 + 1010 = 1 0011 (zakres -2^3; 2^3-1) ✦ np. 5 + 4 = 0101 + 0100 = 1001 = -7 ✦ Przepełnienie ma miejsce wtedy gdy dodawanie liczb o tym samym znaku daje znak przeciwny ✦ ALU sygnalizuje przepełnienie i wynik jest ignorowany ✦ Odejmowanie jest realizowane przez uzupełnienie i dodawanie ✦ a - b = a + (-b) ✦ wystraczy więc zrealizować układy cyfrowe dla dodawania i uzupełniania Sprzętowa realizacja dodawania Mnożenie ✦ Realizacja mnożenia jest zawsze bardzo złożona ✦ Przykład (mnożenie liczb bez znaku) ✦ 1011 ✦ x 1101 ✦ 1011 ✦ 0000 ✦ 1011 ✦ 1011 ✦ 10001111 Mnożna (ang. Multiplicand) (11 dec) Mnożnik ( ang. Multiplier) (13 dec) Iloczyny cząstkowe (ang. Partial products) mnożenie przez 0 (zerowanie) mnożenie przez 1 (kopiowanie) Iloczyn (ang. Product) (143 dec) ✦ Wynik mnożenia liczb 4 bitowych jest 8-bitowy Realizacja sprzętowa mnożnia liczb bez znaku Schemat blokowy mnożenia liczb bez znaku C – bit przeniesienia; A – akumulator; Q – rejestr (mnożna); M – rejestr (mnożnik) Przykład - 1011x1101 C – bit przeniesienia; A – akumulator; Q – rejestr (mnożna); M – rejestr (mnożnik) U2 - mnożenie liczb ujemnych ✦ Procedura mnożenia dla liczb bez znaku nie działa dla liczb ze znakiem! ✦ 1011x1101 = 10001111 ✦ – 5 x –3 = – 113 ✦ nie działa też gdy jedna z liczb jest ujemna ✦ Rozwiązanie 1 ✦ zamiana liczb na liczby bez znaku (jeśli to jest możliwe) ✦ mnożenie liczb bez znaku ✦ jeśli znaki były różne to negujemy wynik ✦ Rozwiązanie 2 ✦ algorytm Bootha: ✦ wykorzystuje fakt że 0011110 = 0100000 – 0000010 oraz sprawdza przejścia 01 (dodawanie mnożnej) i 10 (odejmownie mnożnej) ✦ stosuje przesuniecie arytmetyczne w prawo (ang. arithmetic shift rigth) które w odróżnieniu od przesunięcia logicznego zamiast zera na zwolnione miejsce wstawia bit znaku