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-1 bn-2 bn-3 ... b2 b1 b0 bn-1 - bit znaku liczby
bn-3 ... b0 - bity modułu liczbyDla 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, o czym wkrótce się dowiemy.
Wartość dziesiętna liczby w zapisie ZM
LZM = (-1)bit znaku x moduł liczby Rozpisując poszczególne bity otrzymujemy:
| ||||||
4 bitowy system ZM | ||
---|---|---|
Kod ZM | Przeliczenie | Wartość |
0000 | (-1)0 x 0 | 0 |
0001 | (-1)0 x (20) | 1 |
0010 | (-1)0 x (21) | 2 |
0011 | (-1)0 x (21 + 20) | 3 |
0100 | (-1)0 x (22) | 4 |
0101 | (-1)0 x (22 + 20) | 5 |
0110 | (-1)0 x (22 + 21) | 6 |
0111 | (-1)0 x (22 + 21 + 20) | 7 |
1000 | (-1)1 x 0 | 0 |
1001 | (-1)1 x (20) | (-1) |
1010 | (-1)1 x (21) | (-2) |
1011 | (-1)1 x (21 + 20) | (-3) |
1100 | (-1)1 x (22) | (-4) |
1101 | (-1)1 x (22 + 20) | (-5) |
1110 | (-1)1 x (22 + 21) | (-6) |
1111 | (-1)1 x (22 + 21 + 20) | (-7) |
W tabelce obok przedstawiliśmy wszystkie możliwe do utworzenia liczby w 4-ro bitowym kodzie ZM. Zwróć uwagę, iż wartość 0 posada dwa słowa kodowe: 0000 oraz 1000. W obu przypadkach wartość modułu wynosi 0.
Liczby ujemne uzyskujemy przez ustawienie bitu znaku na 1. Zatem
3(10) = 0011(ZM) , (-3)(10) = 1011(ZM).
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 x (25 + 24 + 22 + 21 + 20)
10110111(ZM) = - (32 + 16 + 4 + 2 + 1)
10110111(ZM) = - 55(10)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 x (24 + 23 + 22 + 21 + 20)
00011111(ZM) = (16 + 8 + 4 + 2 + 1)
00011111(ZM) = 31(10)
Jeśli zrozumiałeś poprzedni rozdział, to metodę przeliczania liczby dziesiętnej na zapis ZM powinieneś już znać. Przeliczenie to wymaga wyznaczenie wartości bitu znaku oraz bitów modułu. Procedura jest następująca:
Procedura wyznaczania zapisu ZM liczby dziesiętnej
| |||
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).
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) x (bn-22n-2 + bn-32n-3 + ...b222 + b121 + b020) = -2n-1 + 1
max(ZM) = 0bn-2bn-3...b2b1b0 = 1 x (bn-22n-2 + bn-32n-3 + ...b222 + b121 + b020) = 2n-1 - 1
Zakres n bitowej liczby w kodzie ZM wynosi Z(ZM) = <-2n-1 + 1, 2n-1 - 1> | |||
4 bitowe liczby ZM posiadają zakres:
od -23 + 1 = -7 = 1111(ZM) do 23 - 1 = 7 = 0111(ZM1) 8 bitowe liczby ZM posiadają zakres:
od -27 + 1 = -127 = 11111111(ZM) do 27 - 1 = 127 = 01111111(ZM1) 16 bitowe liczby ZM posiadają zakres:
od -215 + 1 = -32767 = 1111111111111111(ZM) do 215 - 1 = 32767 = 0111111111111111(ZM1)
Nic nie stoi na przeszkodzie, aby moduł liczby ZM był dwójkową liczbą stałoprzecinkową.
Oblicz wartość stałoprzecinkowej liczby ZM 1001,1101(ZM).
Najstarszy bit zapisu liczby jest bitem znaku. Posiada on wartość 1, zatem liczba jest ujemna. Wyznaczamy wartość jej modułu, który jest dwójkową liczbą stałoprzecinkową:
001,1101(2) = 1 13/16
Stąd:
1001,1101(ZM) = (-1) x (1 13/16) = -1 13/16
Wyznacz zapis ZM liczby dziesiętnej -3,75. Format ZM jest 8-mio bitowy. Moduł posiada cztery cyfry ułamkowe.
- Liczba -3,75 jest ujemna, zatem bit znaku wynosi 1.
- Moduł liczby jest równy 3,75.
- Wyznaczamy dwójkowy zapis modułu: 3,75(10) = 11,11(2)
W podanym formacie ZM moduł jest 7-mio bitowy z 4-ema bitami ułamkowymi. Otrzymany zapis dwójkowy musimy zatem odpowiednio uzupełnić bitami o wartości 0, aby był zgodny z formatem:
11,11 = 011,1100- Do tak otrzymanego modułu dodajemy bit znaku otrzymując: -3,75(10) = 1011,1100(ZM).
Już proste dodawanie dwóch liczb ZM może przekonać nas, iż podane wcześniej zasady arytmetyki liczb dwójkowych są niewystarczające dla tego systemu zapisu liczb:
0011 3 + 1011 + (-3) 1110 (-6) Musimy przyjąć dodatkowe założenia (o ile nie chcemy zmieniać dobrych zasad arytmetyki dwójkowej). Przede wszystkim w działaniach uczestniczą tylko moduły liczb. Bity znaków pełnią różne funkcje decyzyjne, które opisaliśmy w poniższych tabelkach.
Reguły dodawania liczb ZM
wynik = a(ZM) + b(ZM)Znak a(ZM) Znak b(ZM) operacja Znak wyniku 0 0 dodawanie
modułów0 1 1 dodawanie
modułów1 0 1 odejmowanie
modułu mniejszego
od modułu większegoznak większego
modułu1 0
3+2
0 011
+ 0 010-3 + (-2)
1 011
+ 1 0104 + (-6)
1 110
- 0 1005 + (-3)
0 101
- 1 0110 101
51 101
(-5)1 010
(-2)0 010
2
Reguły odejmowania liczb ZM
wynik = a(ZM) - b(ZM)Znak a(ZM) Znak b(ZM) operacja Znak wyniku 0 0 odejmowanie
modułu mniejszego
od modułu większegoZnak a(ZM), jeśli moduł ten jest większy
od modułu b(ZM). Inaczej znak przeciwny.1 1 0 1 dodawanie
modułów0 1 0 dodawanie
modułów1
3 - 2
0 011
- 0 010(-3) - (-2)
1 011
- 1 0102 - (-3)
0 010
+ 1 011(-5) - 2
1 101
+ 0 0100 001
11 001
(-1)0 101
51 111
(-7)
Reguły mnożenia i dzielenia liczb Z-M
wynik = a(ZM) x b(ZM)
wynik = a(ZM) : b(ZM)Znak a(ZM) Znak b(ZM) operacja Znak wyniku 0 0 mnożenie
lub
dzielenie
modułówJeśli znaki a(ZM) i b(ZM) są
takie same, to 0.
Inaczej 11 1 0 1 1 0
3 x 2
0 011
x 0 010(-3) x (-2)
1 011
x 1 0103 x (-2)
0 011
x 1 010(-3) x 2
1 011
x 0 0100 110
60 110
61 110
(-6)1 110
(-6)
|
GNU Free Documentation License.
Źródło: mgr Jerzy Wałaszek