Zapis liczb binarnych ze znakiem W tej prezentacji: Zapis Znak-Moduł (ZM) Zapis uzupełnień do 1 (U1) Zapis uzupełnień do 2 (U2) Zapis Znak-Moduł (ZM) Koncepcyjnie zapis znak - moduł (w skrócie ZM - ang. SM Signed Magnitude) jest najbardziej zbliżony do systemu zapisu liczb używanego przez nas samych. Liczba ZM składa się z dwóch części - bitu znaku oraz bitów wartości liczby (modułu): bn-1bn-2 bn-3 ... b2 b1 b0 bn-1 - bit znaku liczby bn-3 ... b0 - bity modułu liczby Dla liczb dodatnich i zera bit znaku ma wartość 0, dla liczb ujemnych i zera ma wartość 1. Format zapisu ZM musi być ściśle ustalony, aby wiadomo było, który bit jest bitem znaku - w operacjach arytmetycznych bit znaku musimy traktować inaczej niż inne bity. Wartość dziesiętna liczby w zapisie ZM Moduł liczby ZM jest zapisany w naturalnym kodzie dwójkowym NBC, zatem w celu obliczenia jej wartości moduł mnożymy przez 1, gdy bit znaku wynosi 0 lub przez -1, gdy bit znaku wynosi 1. Wzór jest następujący: LZM = (-1)bit znaku x moduł liczby Rozpisując poszczególne bity otrzymujemy: bn-1bn-2...b2b1b0 = (-1)bn-1 (bn-22n-2 + ... + b222 + b121 + b020) gdzie b - bit, cyfra dwójkowa 0 lub 1 n - liczba bitów w zapisie liczby Przykład 1 Obliczyć wartość dziesiętną liczby 10110111(ZM). Pierwszy bit zapisu ZM jest bitem znaku. Wartość 1 informuje nas, iż jest to liczba ujemna. Pozostałe bity tworzą wartość liczby. Moduł jest zapisany w naturalnym systemie dwójkowym, zatem: 10110111(ZM) = (-1)1 (25 + 24 + 22 + 21 + 20) 10110111(ZM) = - (32 + 16 + 4 + 2 + 1) 10110111(ZM) = - 55(10) Przykład 2 Obliczyć wartość dziesiętną liczby 00011111(ZM). Bit znaku ma wartość 0, zatem jest to liczba dodatnia. Wartość tej liczby jest równa wartości jej modułu zapisanego w naturalnym kodzie dwójkowym. 00011111(ZM) = (-1)0 (24 + 23 + 22 + 21 + 20) 00011111(ZM) = (16 + 8 + 4 + 2 + 1) 00011111(ZM) = 31(10) Procedura wyznaczania zapisu ZM liczby dziesiętnej 1. Jeśli liczba jest dodatnia, to bit znaku ma wartość 0. W przeciwnym razie bit znaku ma wartość 1. 2. Obliczamy wartość absolutną liczby, czyli jej moduł. 3. Wyznaczamy bity modułu 4. Otrzymane bity modułu uzupełniamy w miarę potrzeby bitami o wartości 0, aby otrzymać ustaloną w formacie liczbę bitów dla modułu. 5. Do bitów modułu dodajemy bit znaku i otrzymujemy zapis ZM. Przykład Przedstawić w 8-mio bitowym kodzie ZM liczbę o wartości dziesiętnej -9. Wyznaczamy bit znaku. Liczba -9 jest ujemna, zatem b7 = 1 (najstarszy bit). Wartość absolutna z -9 to 9 (po prostu opuszcza się znak -). Obliczamy zapis dwójkowy modułu 9(10) = 1001(2). Moduł 8-mio bitowej liczby ZM składa się z 7 bitów, zatem do otrzymanego wyniku dodajemy trzy początkowe zera otrzymując 0001001. Łączymy bit znaku 1 z bitami modułu 0001001 i dostajemy zapis ZM liczby -9(10) = 10001001(ZM) Zakres liczb w zapisie ZM Zadanie polega na znalezieniu najmniejszej i największej wartości liczby, którą da się przedstawić w danym zapisie ZM. Łatwo zauważyć, że w obu przypadkach moduł musi mieć wartość maksymalną, a bit znaku 1 dla wartości najmniejszej i 0 dla wartości największej. Ponieważ moduł jest zapisany w naturalnym kodzie dwójkowym NBC, jego wartość jest równa maksymalnej wartości n-1 bitowej liczby dwójkowej. Dla n bitów otrzymujemy: min(ZM) = 1bn-2bn-3...b2b1b0 = (-1) (bn-22n-2 + bn-32n-3 + ...b222 + b121 + b020) = -2n-1 + 1 max(ZM) = 0bn-2bn-3...b2b1b0 = 1 (bn-22n-2 + bn-32n-3 + ...b222 + b121 + b020) = 2n-1 - 1 Zakres liczby w zapisie ZM Zakres n bitowej liczby w kodzie ZM wynosi Z(ZM) = <-2n-1 + 1, 2n-1 - 1> Zapis U1 Drugim podejściem do rozwiązania problemu liczb ze znakiem jest system uzupełnień do 1 zwany systemem U1 (ang. 1C - One's Complement). W systemie tym wszystkie bity zapisu liczby posiadają swoje wagi (w ZM bit znaku nie posiadał wagi). Najstarszy bit jest bitem znaku i ma wagę równą (-2n-1+1), gdzie n oznacza ilość bitów w zapisie liczby. Pozostałe bity posiadają wagi takie jak w naturalnym systemie dwójkowym Wartość dziesiętna liczby w zapisie U1 Wartość liczby U1 obliczamy zgodnie z poznanymi zasadami - cyfry mnożymy przez wagi pozycji, na których się znajdują i dodajemy otrzymane iloczyny: bn-1bn-2bn-3...b2b1b0 (U1) = bn-1(-2n-1+1) + bn-22n-2 + bn-32n-3 + ... + b222 + b121 + b020 gdzie: b - bit, cyfra dwójkowa 0 lub 1 n - liczba bitów w zapisie liczby Przeliczanie liczb dziesiętnych na zapis U1 Jeśli liczba jest dodatnia, to najstarszy bit znakowy posiada wartość 0. Pozostałe bity służą do zapisu liczby w naturalnym kodzie binarnym: 0111(U1) = 7(10), 0001(U1) = 1(10), 01111111(U1) = 127(10) Jeśli liczba jest ujemna, to najstarszy bit znakowy ma wartość 1. Pozostałe bity są negacjami bitów modułu wartości liczby: 1101(U1) = (-2)(10) : moduł 2(10) = 010(2) : NOT 010 = 101 1100(U1) = (-3)(10) : moduł 3(10) = 011(2) : NOT 011 = 100 1010(U1) = (-5)(10) : moduł 5(10) = 101(2) : NOT 101 = 010 Procedura wyznaczania zapisu U1 dla liczby dziesiętnej 1. Jeśli liczba jest dodatnia, znajdujemy jej reprezentację w naturalnym kodzie binarnym i uzupełniamy bitami o wartości 0 do uzyskania zadanej liczby bitów wymaganej przez przyjęty format zapisu U1. 2. Jeśli liczba jest ujemna, obliczamy jej moduł. Moduł przedstawiamy w naturalnym systemie dwójkowym uzupełniając go bitami o wartości 0 do długości przyjętego formatu U1. Następnie wszystkie bity zamieniamy na przeciwne i w wyniku otrzymujemy zapis U1. Przykład 1 Wyznaczyć 8-mio bitowy zapis U1 liczby dziesiętnej 76. Liczba 76 jest dodatnia, zatem wyznaczamy jej zapis w naturalnym systemie dwójkowym: 76(10) = 1001100(2) Otrzymaną liczbę dwójkową uzupełniamy bitami o wartości 0 do długości formatu otrzymując: 76(10) = 01001100(U1) Przykład 2 Wyznaczyć 8-mio bitowy zapis U1 liczby dziesiętnej (-113). Liczba (-113) jest ujemna. Jej moduł wynosi 113. Wyznaczamy zapis dwójkowy modułu: 113(10) = 1110001(2) Otrzymany zapis uzupełniamy bitami 0 do długości 8 bitów. Następnie negujemy wszystkie bity i otrzymujemy w ten sposób zapis U1 liczby -113: -113(10) = NOT 01110001 = 10001110(U1). Zakres liczb w zapisie U1 Liczba U1 przyjmuje wartość największą dla bitu znaku równego 0 i pozostałych bitów równych 1. Ponieważ pozostałe bity przedstawiają w tym przypadku liczbę n-1 bitową w naturalnym kodzie dwójkowym, to dla n bitowego kodu U1 otrzymujemy: max(U1) = 2n-1 - 1. Najmniejszą wartość liczba U1 przyjmuje dla bitu znakowego równego 1 (waga ujemna) i pozostałych bitów równych 0. Ponieważ w tym przypadku do wagi bitu znakowego nic nie dodajemy, otrzymujemy: min(U1) = -2n-1 + 1 Zakres liczb w zapisie U1 Zakres n bitowej liczby w kodzie U1 wynosi Z(U1) = (-2n-1 + 1, 2n-1 - 1) Zakres ten jest identyczny z zakresem liczb w kodzie ZM. Zapis U2 Zapis U1 posiada kilka niedogodności (arytmetyka zmieniamy wagę bitu znakowego z (-2n-1 + 1) na (-2n-1), gdzie n oznacza ilość bitów w formacie kodu. Wagi stają się teraz jednorodne - bit znakowy posiada wagę ujemną, lecz o wartości bezwzględnej takiej samej jak w naturalnym kodzie dwójkowym. Nowy kod nosi nazwę uzupełnień do podstawy 2 lub w skrócie U2 (ang. 2C - Two's Complement). 19 Wartość dziesiętna liczby w zapisie U2 Wartość liczby U2 obliczamy zgodnie z poznanymi zasadami - cyfry mnożymy przez wagi pozycji, na których się znajdują i dodajemy otrzymane iloczyny. Waga bitu znakowego jest ujemna. bn-1bn-2bn-3...b2b1b0 (U2) = bn-1(-2n-1) + bn-22n-2 + bn-32n-3 + ... + b222 + b121 + b020 gdzie b - bit, cyfra dwójkowa 0 lub 1 n - liczba bitów w zapisie liczby Przykład Najstarszy bit określa znak liczby. Jeśli jest równy 0, liczba jest dodatnia i resztę zapisu możemy potraktować jak liczbę w naturalnym kodzie dwójkowym. 01101011(U2) = 64 + 32 + 8 + 2 + 1 = 107(10). Jeśli bit znaku ustawiony jest na 1, to liczba ma wartość ujemną. Bit znaku ma wagę (-2n-1), gdzie n oznacza liczbę bitów w wybranym formacie U2. Reszta bitów jest zwykłą liczbą w naturalnym kodzie dwójkowym. Wagę bitu znakowego i wartość pozostałych bitów sumujemy otrzymując wartość liczby U2: 11101011(U2) = (-27) + 64 + 32 + 8 + 2 + 1 = -128 + 107 = (21)(10). Zwróć uwagę, iż postać ujemna liczby U2 nie jest już tak czytelna dla nas jak w przypadku kodów ZM (tylko zmiana bitu znaku) i U1 (negacja wszystkich bitów). przeliczanie ujemnej liczby dziesiętnej na zapis U2 – sposób 1 Liczba ujemna musi mieć ustawiony na 1 bit znaku. Zatem nasze zadanie sprowadza się do znalezienia wartości pozostałych bitów. Bit znaku stoi na pozycji o wadze (-2n-1), n - ilość bitów w formacie U2. Pozostałe bity zapisu liczby tworzą naturalny od dwójkowy. Wartość tego kodu musi być taka, aby po dodaniu jej do wagi pozycji znakowej otrzymać wartość kodowanej liczby. Zapiszmy to w formie równania: kodowana liczba = waga bitu znakowego + wartość kodu pozostałych bitów kodowana liczba = (-2n-1) + wartość kodu pozostałych bitów stąd wartość kodu pozostałych bitów = 2n-1 + kodowana liczba Po wyznaczeniu wartości tego kodu tworzymy jego zapis w systemie dwójkowym, uzupełniamy w miarę potrzeby bitem 0 do długości formatu U2 - 1 i dodajemy bit znakowy 1. Konwersja jest gotowa Przykład Wyznaczyć 8-mio bitowy kod U2 dla liczby dziesiętnej (-45)(10). Wyznaczamy moduł wagi pozycji znakowej. Dla n = 8, 2n-1 = 27 = 128 wartość kodu pozostałych bitów = 128 + (-45) = 83 = 1010011(2) Dodajemy bit znaku równy 1 i otrzymujemy: (-45)(10) = 11010011 przeliczanie ujemnej liczby dziesiętnej na zapis U2 – sposób 2 Jeśli do liczby 2n (n - ilość bitów w formacie U2) dodamy przetwarzaną liczbę dziesiętną, to w wyniku otrzymamy wartość kodu dwójkowego równoważnego bitowo (tzn. o takiej samej postaci) kodowi U2 przetwarzanej liczby. Wynik dodawania wystarczy zapisać w postaci naturalnego kodu dwójkowego i konwersja jest zakończona. Przykład Wyznaczyć 8-mio bitowy kod U2 dla liczby dziesiętnej (-45)(10). 28 + (-45) = 256 - 45 = 211 = 11010011(2). Stąd (-45)(10) = 11010011(U2). Zakres liczb w zapisie U2 Największa liczba U2 powstaje dla bitu znaku równego 0, a pozostałych bitów równych 1. Ponieważ pozostałe bity przedstawiają wartość w naturalnym kodzie binarnym i jest ich n-1, to max(U2) = 2n-1 - 1 Z kolei najmniejszą wartość liczby U2 otrzymamy dla bitu znaku równego 1, a pozostałych bitów równych 0. W tym przypadku wartość liczby jest równa wadze pozycji znakowej, czyli min(U2) = (-2n-1) Zakres liczb w zapisie U2 Zakres n bitowej liczby w kodzie U2 wynosi Z(U2) = (-2n-1, 2n-1 - 1) W porównaniu z systemami ZM i U1, zakres liczb U2 jest niesymetryczny - liczb ujemnych jest o jedną więcej niż liczb dodatnich