Wykład 3 3-1 Reprezentacja liczb całkowitych ze znakiem Do przedstawienia liczb całkowitych ze znakiem stosowane są następujące kody: - ZM (znak-moduł) - U1 (uzupełnienie do 1) - U2 (uzupełnienie do 2) We wszystkich kodach znak przechowuje się w najstarszym bicie słowa maszynowego. Kod znak-moduł ZM, Z-M, SM (Signed Magnitude), S+M W kodzie znak-moduł wszystkie bity liczby poza najstarszym mają takie same znaczenie jak w kodzie NKB. Najstarszy bit jest bitem znaku: 0 - liczba dodatnia, 1 - liczba ujemna. c Wartość liczby wynosi n 1 i L = ( 1) ci 2. i= 0 Reprezentacja liczb w kodzie ZM w 8-bitowym formacie: Liczba (10) Kod ZM Liczba (10) Kod ZM +0 00000000-0 10000000 1 00000001-1 10000001 2 00000010-2 10000010 3 00000011-3 10000011 4 00000100-4 10000100 5 00000101-5 10000101 6 00000110-6 10000110 7 00000111-7 10000111 8 00001000-8 10001000 9 00001001-9 10001001 10 00001010-10 10001010 n 2
Wykład 3 3-2 W kodzie tym występują dwie reprezentacje zera: +0 (00000000) i 0 (10000000). Zakres liczb w formacie ZM: -2 n-1 +1 L 2 n-1-1 Zakres liczb 8-bitowych w kodzie ZM: -127...+127. 11111111 (ZM) = -2 7 +1 = -127 (minimalna) 01111111 (ZM) = 2 7-1 = 127 (maksymalna) Zakres liczb 16-bitowych w kodzie ZM: -32 767...+32 767. 11111111 11111111 (ZM) = -2 15 +1 = -32 767 (minimalna) 01111111 11111111 (ZM) = 2 15-1 = 32 767 (maksymalna) Przedstawienie liczby dziesiętnej w kodzie ZM: - znak liczby zakodować w starszym bicie słowa maszynowego - moduł liczby przedstawić w kodzie NKB - rozszerzyć liczbę zerami z lewej strony do formatu słowa maszynowego. -117 (10) =L (ZM) -117 (10) = 117 (10) = 1110101 (NKB) 11110101 (ZM) (w formacie 8-bitowym) 10000000 01110101 (ZM) (w formacie 16-bitowym). Obliczenie wartości dziesiętnej liczby w kodzie ZM: 10101010 (ZM) = L (10) 1 liczba ujemna L (10) = (-1) 1 (0 2 6 + 1 2 5 + 0 2 4 + 1 2 3 + 0 2 2 + 1 2 1 + 0 2 0 ) = -(32+8+2) = -42 (10) 01001001 (ZM) = L (10) 0 liczba dodatnia L (10) = (-1) 0 (1 2 6 + 0 2 5 + 0 2 4 + 1 2 3 + 0 2 2 + 0 2 1 + 1 2 0 ) = 64+8+1 = 73 (10) Wadą kodu ZM jest utrudnione wykonanie operacji dodawania i odejmowania. Tak w przypadku dodawania porównywane są znaki liczb, jeśli są równe wykonuje się dodawanie modułów liczb, jeśli róŝne porównują się moduły i wykonuje się odejmowanie mniejszego modułu od większego. W celu uproszczenia operacji arytmetycznych na liczbach ze znakiem stosowane są kody z uzupełnieniem.
Wykład 3 3-3 Uzupełnienia liczb Wykonanie operacji arytmetycznych na liczbach ze znakiem wymaga wykorzystania pojęcia uzupełnienie liczb. W pozycyjnym systemie liczbowym o podstawie P dla n-cyfrowej liczby definiuje się dwa rodzaje uzupełnień: 1. uzupełnienie P-te: L = P n L dla L 0 L = 0 dla L = 0 2. uzupełnienie (P-1)-sze: L = P n L P 0 W zaleŝności od podstawy systemu liczbowego uzupełnienia przyjmują nazwy: uzupełnienie dwójkowe U2 i jedynkowe U1 (dla P=2), uzupełnienie dziesiątkowe U10 i dziesiątkowe U9 (P=10), szesnastkowe U16 i piętnastkowe U15 (P=16). Uzupełnienie P-te moŝna uzyskać przez dodanie do uzupełnienia (P-1)-szego wartości P 0 : L = L + P 0 MoŜna zauwaŝyć, Ŝe dwukrotne uzupełnienie danej liczby pozwala uzyskać jej pierwotną wartość: P P n n n n L = P ( P L) = L L P 0 = P n ( P Przykład 00101011 (2) U2, U1 n 0 L P ) P 0 = L
Wykład 3 3-4 Obliczenie uzupełnienia z definicji jest stosunkowo trudne. MoŜna je uprościć: uzupełnienie (P-1)-sze moŝna utworzyć przez odjęcie kaŝdej cyfry liczby od (P-1). Dla systemu dwójkowego tej operacji odpowiada zwykła negacja bitów (zamiana wartości bitów na przeciwną). Dla uzupełnienia P-go do tak obliczonej wartości naleŝy jeszcze dodać 1 (P 0 ). Przykład 00101011 (2) U2, U1 538 (10) U10, U9 Niektóre kody BCD dwójkowo-dziesiętne posiadają taką własność, Ŝe uzupełnienia dziesiątkowe cyfr dziesiętnych uzyskuje się przez zanegowanie bitów ich dwójkowej reprezentacji (kody samouzupełniające). Upraszcza to wykonanie operacji arytmetycznych na liczbach BCD. Reprezentacja liczb w kodzie U1 (uzupełnień do jedności) - Najstarszy bit jest bitem znaku: 0 - liczba dodatnia, 1 - liczba ujemna. - W kodzie U1 liczby dodatnie zapisywane są tak samo jak w NKB, ale najbardziej znaczący bit traktowany jest jako bit znaku, dla liczby dodatniej przyjmuje wartość 0. - Liczby ujemne otrzymywane są poprzez bitową negację danej liczby, bit znakowy przyjmuje wtedy wartość 1.
Wykład 3 3-5 - Starszy bit słowa ma wagę -2 n-1 + 1. n 2 i 1 i 2 i 0 n 1 - Wartość liczby wynosi = ( 2 + 1) = L c n c. Reprezentacja liczb w kodzie U1 w 8-bitowym formacie: Liczba (10) Kod U1 Liczba (10) Kod U1 +0 00000000-0 11111111 1 00000001-1 11111110 2 00000010-2 11111101 3 00000011-3 11111100 4 00000100-4 11111011 5 00000101-5 11111010 6 00000110-6 11111001 7 00000111-7 11111000 8 00001000-8 11110111 9 00001001-9 11110110 10 00001010-10 11110101 W kodzie tym występują dwie reprezentacje zera: +0 (00000000) i 0 (11111111). Zakres liczb w formacie U1: -2 n-1 +1 L 2 n-1-1 Zakres liczb 8-bitowych w kodzie U1: -127...+127. 10000000 (U1) = -2 7 +1 = -127 (minimalna) 01111111 (U1) = 2 7-1 = 127 (maksymalna) Zakres liczb 16-bitowych w kodzie U1: -32 767...+32 767. 10000000 00000000 (U1) = -2 15 +1 = -32 767 (minimalna) 01111111 11111111 (U1) = 2 15-1 = 32 767 (maksymalna) Przedstawienie liczby dziesiętnej w kodzie U1: - znak liczby zakodować w starszym bicie słowa maszynowego - moduł liczby przedstawić w kodzie NKB - rozszerzyć moduł zerami z lewej strony do formatu słowa maszynowego
Wykład 3 3-6 - jeśli liczba jest ujemna zanegować wszystkie bity modułu. -117 (10) =L (U1) -117 (10) = 117 (10) = 1110101 (NKB) 10001010 (U1) (w formacie 8-bitowym) 11111111 10001010 (U1) (w formacie 16-bitowym). Obliczenie wartości dziesiętnej liczby w kodzie U1: 10101010 (U1) = L (10) 1 liczba ujemna L (10) = 1 (-2 7 +1) + (0 2 6 + 1 2 5 + 0 2 4 + 1 2 3 + 0 2 2 + 1 2 1 + 0 2 0 ) = = -127 + (32+8+2) = -85 (10) 01001001 (U1) = L (10) 0 liczba dodatnia L (10) = 0 (-2 7 +1) + (1 2 6 + 0 2 5 + 0 2 4 + 1 2 3 + 0 2 2 + 0 2 1 + 1 2 0 ) = 64+8+1 = 73 (10) Arytmetyka w kodzie U1 - Dodawanie w kodzie U1 polega na zwykłym dodawaniu bitowym - Jeśli na najstarszym bicie wystąpi przeniesienie, to naleŝy je dodać do końcowego wyniku.
Wykład 3 3-7 Reprezentacja liczb w kodzie U2(uzupełnień do dwóch) - Najstarszy bit jest bitem znaku: 0 - liczba dodatnia, 1 - liczba ujemna. - W kodzie U2 liczby dodatnie zapisywane są tak samo jak w NKB, ale najbardziej znaczący bit traktowany jest jako bit znaku, dla liczby dodatniej przyjmuje wartość 0. - Liczby ujemne otrzymywane są poprzez bitową negację danej liczby oraz dodania do zanegowanej liczby jedynki, bit znakowy przyjmuje wtedy wartość 1. - Starszy bit słowa ma wagę -2 n-1. n 2 i 1 i 2 i 0 n 1 - Wartość liczby wynosi = ( 2 ) = L c n c. Reprezentacja liczb w kodzie U2 w 8-bitowym formacie: Liczba (10) Kod U2 Liczba (10) Kod U2 0 00000000 1 00000001-1 11111111 2 00000010-2 11111110 3 00000011-3 11111101 4 00000100-4 11111100 5 00000101-5 11111011 6 00000110-6 11111010 7 00000111-7 11111001 8 00001000-8 11111000 9 00001001-9 11110111 10 00001010-10 11110110 W kodzie tym występuje jedna reprezentacja zera: 00000000. Zakres liczb w formacie U2: -2 n-1 L 2 n-1-1, jest niesymetryczny dla górnej i dolnej granicy. Nie istnieje liczba przeciwna do najmniejszej -2 n-1. Zakres liczb 8-bitowych w kodzie U1: -128...+127. 10000000 (U2) = -2 7 = -128 (minimalna)
Wykład 3 3-8 01111111 (U2) = 2 7-1 = 127 (maksymalna) Zakres liczb 16-bitowych w kodzie U2: -32 768...+32 767. 10000000 00000000 (U2) = -2 15 = -32 768 (minimalna) 01111111 11111111 (U2) = 2 15-1 = 32 767 (maksymalna) Przy rozszerzeniu słowa zajmowanego przez liczbę w kodzie U2, dodawany obszar wypełnia się bitem znaku. Przedstawienie liczby dziesiętnej w kodzie U2: - moduł liczby przedstawić w kodzie NKB - rozszerzyć moduł zerami z lewej strony do formatu słowa maszynowego - jeśli liczba jest ujemna zanegować wszystkie bity liczby - do wyniku dodać 1. -117 (10) =L (U2) -117 (10) = 117 (10) = 01110101 (NKB) 10001010 -- po negacji bitów + 1 10001011 10001011 (U2) (w formacie 8-bitowym) 11111111 10001011 (U2) (w formacie 16-bitowym). Obliczenie wartości dziesiętnej liczby w kodzie U2: 10101010 (U2) = L (10) 1 liczba ujemna L (10) = 1 (-2 7 ) + (0 2 6 + 1 2 5 + 0 2 4 + 1 2 3 + 0 2 2 + 1 2 1 + 0 2 0 ) = = -128 + (32+8+2) = -86 (10) 01001001 (U2) = L (10) 0 liczba dodatnia L (10) = 0 (-2 7 ) + (1 2 6 + 0 2 5 + 0 2 4 + 1 2 3 + 0 2 2 + 0 2 1 + 1 2 0 ) = 64+8+1 = 73 (10)
Wykład 3 3-9 Arytmetyka w kodzie U2 Dodawanie Dodawanie liczb w kodzie U2 odbywa się standardową metodą (bit po bicie) traktujemy liczby jako zwykłe liczby binarne (dodatnie), dodajemy je otrzymując wynik w kodzie U2. W operacji dodawania bierze udział takŝe bit znaku, a przeniesienie poza najstarszy bit znaku jest ignorowane. Składniki Suma a i b i p i p i+1 s i 0 0 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 Dodawanie dowolnych liczb w kodzie U2 daje poprawny wynik zawsze wtedy, gdy mieści się on w zakresie liczb dla danego formatu. Jeśli znaki obu składników są jednakowe, a znak sumy jest przeciwny to suma wykracza poza zakres reprezentowalności dla danego formatu, czyli powstaje przepełnienie (overflow). KaŜdy procesor posiada w swoim rejestrze znaczników flagi, które sygnalizują, czy w wyniku wykonania operacji powstało przeniesienie ze starszego bitu wyniku (znacznik CF Carry Flag) oraz czy powstało przepełnienie (znacznik OF Overflow Flag). Ustawienie znacznika OF=1 sygnalizuje błąd wykonania operacji, natomiast CF=1 nie sygnalizuje błędu. Przykładowy rejestr znaczników procesora:
Wykład 3 3-10 Przykłady (-60) (10) + 74 (10) =? 60 (10) + (-74) (10) =? (-60) (10) + (-74) (10) =?
Wykład 3 3-11 60 (10) + 74 (10) =? Odejmowanie Odejmowanie odbywa się według tych samych zasad jak w NKB. W operacji odejmowania bierze udział bit znaku, a poŝyczka spoza najstarszego bitu jest ignorowana. Wynik odejmowania jest poprawny, jeśli mieści się w zakresie liczb dla danego formatu. PoŜyczka tylko do bitu znaku lub tylko z bitu znaku Przykłady 60 (10) - 74 (10) =?
Wykład 3 3-12 (-60) (10) - 74 (10) =? MnoŜenie Do praktycznych algorytmów mnoŝenia liczb w kodzie U2 naleŝą: - algorytm Robertsona - algorytm powielonego znaku - algorytm Bootha Algorytm Robertsona Algorytmie Robertsona traktujemy liczby w kodzie U2 tak jak w NKD z tym, Ŝe mnoŝnik pozbawiamy najstarszego bitu (znaku). Otrzymany iloczyn naleŝy skorygować, dodając poprawkę. Iloczyn dwóch liczb A i B w kodzie U2 moŝna rozłoŝyć na sumę dwóch składników: n 1 A B = -b n 2 n A + A = n 1 i i= 0 i 0 b 2 i i i b 2 to jest mnoŝnik pozbawiony znaku. Pierwszy składnik to poprawka korekcyjna dla przypadku ujemnego mnoŝnika, wynosi tyle, co dopełnienie mnoŝnej przesuniętej w lewo o n bitów. Przykład (-5) (10) (-3) (10) =? (-5) (10) = 1011 (U2) (-3) (10) = 1101 (U2)
Wykład 3 3-13 Obliczenie pseudoiloczynu: Obliczenie poprawki: Korygowanie wyniku: +
Wykład 3 3-14 Algorytm powielonego znaku: - dwukrotnie zwiększyć kaŝdą z liczb, powielając bit znaku na wszystkie dodatkowe pozycje - po wykonaniu rozszerzenia znakowego liczby są mnoŝone jak w kodzie NKB - otrzymywany wynik powinien być liczbą o długości równej sumie długości mnoŝonych liczb bity wykraczające poza tę długość są ignorowane. Przykład Algorytm Bootha: 1. W młodszej części wyniku zapisać mnoŝnik, starszą część wyzerować. Przyjmuje się, Ŝe bit przeniesienia BP=0. 2. a) Jeśli bit przeniesienia jest ustawiony BP=1, do starszej części wyniku dodać mnoŝną. b) Jeśli bieŝący najmłodszy bit znacznika jest ustawiony, od starszej części wyniku odjąć mnoŝną. c) Jeśli oba te bity są ustawione lub oba wyzerowane, nie wykonuje się Ŝadnych czynności. 3. Wynik przesunąć w prawo o 1 bit powielając bit znakowy, wychodzący bit zapisać do bitu przeniesienia BP. 4. Czynności opisane w punktach 2 i 3 powtórzyć dla wszystkich bitów mnoŝnika. Przykłady
Wykład 3 3-15
Wykład 3 3-16 Dzielenie Operacja dzielenia dla liczb w U2 jest bardzo skomplikowana, dlatego zwykle operacja dzielenia wykonuje się na dodatnich odpowiednikach liczb U2 przedstawionych w kodzie NKB. W przypadku róŝnych znaków liczb wynik i/lub reszta zamieniane są na postać ujemną U2. Metoda dzielenia w U2 składa się z następujących kroków: - zapamiętanie znaków dzielonych liczb - zamiana liczb ujemnych na dodatnie - wykonanie dzielenia dla liczb naturalnych - zmiana wyniku na postać U2, jeśli znak dzielnej i dzielnika róŝnią się. Podczas dzielenia znaki wyniku i reszty przyjmują wartości przedstawione w tabeli.
Wykład 3 3-17 Dzielna Dzielnik Wynik Reszta 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 1 Przykład -12 (10) : 4 (10) = -3 (10) 12 (10) =1100 (NKB) 4 (10) =0100 (NKB) -0011 (NKB) = 1101 (U2)