Zapis liczb binarnych ze znakiem

Transkrypt

Zapis liczb binarnych ze znakiem
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