Zapis liczb binarnych ze
znakiem
W tej prezentacji:
Zapis Znak-Moduł (ZM)
Zapis uzupełnień do 1 (U1)
Zapis uzupełnień do 2 (U2)
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.
Zapis Znak-Moduł (ZM)
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:
1
0110111
(ZM)
=
(-1)
1
(2
5
+ 2
4
+ 2
2
+ 2
1
+ 2
0
)
1
0110111
(ZM)
= - (32 + 16 + 4 + 2 + 1)
1
0110111
(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
.
0
0011111
(ZM)
=
(-1)
0
(2
4
+ 2
3
+ 2
2
+ 2
1
+ 2
0
)
0
0011111
(ZM)
= (16 + 8 + 4 + 2 + 1)
0
0011111
(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:
0
111
(U1)
= 7
(10)
,
0
001
(U1)
= 1
(10)
,
0
1111111
(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:
1
101
(U1)
= (-2)
(10)
:
moduł 2
(10)
= 010
(2)
: NOT 010 =
101
1
100
(U1)
= (-3)
(10)
:
moduł 3
(10)
= 011
(2)
: NOT 011 =
100
1
010
(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
.
19
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)
.
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)
(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)
= 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