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): b n-1 b n-2 b n-3... b 2 b 1 b 0 b n-1 - bit znaku liczby b n-3... b 0 - 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: L ZM = (-1) bit znaku x moduł liczby Rozpisując poszczególne bity otrzymujemy: b n-1 b n-2...b 2 b 1 b 0 = (-1)b n-1 (b n-2 2 n-2 +... + b 2 2 2 + b 1 2 1 + b 0 2 0 ) 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 (2 5 + 2 4 + 2 2 + 2 1 + 2 0 ) 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 (2 4 + 2 3 + 2 2 + 2 1 + 2 0 ) 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 b 7 = 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) = 1b n-2 b n-3...b 2 b 1 b 0 = (-1) (b n-2 2 n-2 + b n-3 2 n-3 +...b 2 2 2 + b 1 2 1 + b 0 2 0 ) = -2 n-1 + 1 max (ZM) = 0b n-2 b n-3...b 2 b 1 b 0 = 1 (b n-2 2 n-2 + b n-3 2 n-3 +...b 2 2 2 + b 1 2 1 + b 0 2 0 ) = 2 n-1-1
Zakres liczby w zapisie ZM Zakres n bitowej liczby w kodzie ZM wynosi Z (ZM) = <-2 n-1 + 1, 2 n-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ą (-2 n-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: b n-1 b n-2 b n-3...b 2 b 1 b 0 (U1) = b n-1 (-2 n-1 +1) + b n-2 2 n-2 + b n-3 2 n-3 +... + b 2 2 2 + b 1 2 1 + b 0 2 0 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) = 2 n-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) = -2 n-1 + 1
Zakres liczb w zapisie U1 Zakres n bitowej liczby w kodzie U1 wynosi Z (U1) = (-2 n-1 + 1, 2 n-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 (-2 n-1 + 1) na (-2 n-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. b n-1 b n-2 b n-3...b 2 b 1 b 0 (U2) = b n-1 (-2 n-1 ) + b n-2 2 n-2 + b n-3 2 n-3 +... + b 2 2 2 + b 1 2 1 + b 0 2 0 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 (-2 n-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 = (-2 n-1 ) + wartość kodu pozostałych bitów stąd wartość kodu pozostałych bitów = 2 n-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, 2 n-1 = 2 7 = 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 2 n (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) 2 8 + (-45) = 256-45 = 211 = 11010011. (2) Stąd (-45) = 11010011. (10) (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) = 2 n-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) = (-2 n-1 )
Zakres liczb w zapisie U2 Zakres n bitowej liczby w kodzie U2 wynosi Z (U2) = (-2 n-1, 2 n-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