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