Znak - Moduł jest to system binarnego kodowania liczb całkowitych. Jest on prosty zarówno w zapisie jak i w użyciu dzięki temu, że jest bardzo zbliżony do tradycyjnego zapisu liczb. W środowisku komputerowym rzadko stosowany ze względu na kodowanie U2.
Podczas tradycyjnego zapisu liczb całkowitych do oznaczania liczby ujemnej używa się znaku minus. Jednak jak wiadomo minus jest, albo go nie ma, więc w komputerze wystarczy tylko jeden taki bit. W kodowaniu ZM pierwszy bit zapisu oznacza znak: 0 oznacza liczbę dodatnią, a 1 oznacza liczbę ujemną. Dalsza część zapisu to zapis binarny kodowanej liczby.
Innymi słowy jeśli mamy liczbę składającą się z n bitów to indeksując od 0 tak, że najmniej znaczący bit to b0 otrzymujemy następujący wzór: WZM = (-1)bn - 1·(bn - 2 + .. + b2 + b1 + b0). Przypatrzmy się poniższym przykładom, aby to lepiej zrozumieć:
Zapis ZM | Przeliczenie | Zakodowana liczba |
---|---|---|
01 | (-1)0·20 = 1 | 1 |
11 | (-1)1·20 = -1 | -1 |
0101 | (-1)0·(22 + 20) = 5 | 5 |
1111 | (-1)1·(22 + 21 + 20) = -7 | -7 |
W informatyce przyjmuje się, że komputer operuje na n bitach, gdzie n to pewna potęga liczby 2. Oznacza to, że liczba w zapisie ZM zawsze musi mieć n bitów. To powoduje, że istnieje wtedy potrzeba uzupełniania zapisu oraz zakres liczb jaki może być przechowywany. Niech przykładowo liczby będą przeliczane na zapis 4 i 8 bitowy.
Liczba dziesiętna | Znak | Moduł | Kod ZM 4bity | Kod ZM 8bity |
---|---|---|---|---|
1 | 0 | 1 | 0001 | 00000001 |
-1 | 1 | 1 | 1001 | 10000001 |
7 | 0 | 111 | 0111 | 00000111 |
-40 | 1 | 101000 | - | 10101000 |
W powyższej tabelce można zauważyć, że liczby -40 nie można zakodować na 4 bitach. Jest to spowodowane faktem, że w tym zapisie można zakodować tylko 3 bity modułu oraz bit znaku. Pozostaje teraz jeszcze przedstawić zakres liczb jaki można przechować w tym kodowaniu. Otóż zakres to [2n - 1 + 1, 2n - 1 - 1]. Należy również zauważyć, że w tym systemie istnieje podwójna reprezentacja zera! Otóż 100..00ZM = 000..00ZM = 0. Z tego powodu istnieje w tym zapisie zero dodatnie jak i ujemne. W informatyce powoduje to pewne problemy podczas porównywania liczb.
Arytmetyka liczb w kodowaniu ZM jest bardzo podobna do tych zapisanych binarnie lub dziesiętnie, ale należy pamiętać, że pierwszy bit oznacza znak. To powoduje pewne komplikacje, ponieważ pierwszy bit tak naprawdę nie posiada wartości, którą można dodać, albo odjąć. Jednak nie oznacza to, że trzeba rezygnować z poznanych zasad arytmetyki. Należy jedynie przyjąć dodatkowe założenia. Załóżmy, że mamy dwie liczby aZM oraz bZM, a oto operacje, które możemy na nich wykonać:
Jeśli obie liczby mają takie same znaki to podczas dodawania pewne jest, że znak się nie zmieni. Inaczej jest, gdy są różnych znaków - wtedy może okazać się, że znak się zmieni na znak liczby o większym module.
Znak aZM | Znak bZM | Operacja | Znak końcowy |
---|---|---|---|
0 | 0 | sumowanie modułów | 0 |
1 | 1 | sumowanie modułów | 1 |
0 | 1 | odejmowanie modułu mniejszego od większego | znak większego modułu |
1 | 0 | odejmowanie modułu mniejszego od większego | znak większego modułu |
0 | 0 | 0 | 1 | ||
---|---|---|---|---|---|
+ | 0 | 0 | 1 | 1 | |
0 | 1 | 0 | 0 |
1 | 1 | 0 | 1 | ||
---|---|---|---|---|---|
+ | 1 | 0 | 0 | 1 | |
1 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | ||
---|---|---|---|---|---|
+ | 0 | 0 | 0 | 1 | |
1 | 1 | 0 | 0 |
0 | 0 | 1 | 1 | ||
---|---|---|---|---|---|
+ | 1 | 1 | 1 | 1 | |
1 | 1 | 0 | 0 |
W tym przypadku znak jest ustalony dla liczb o różnych znakach, a trzeba dodatkowo go ustalać gdy obie liczby mają ten sam znak
Znak aZM | Znak bZM | Operacja | Znak końcowy |
---|---|---|---|
0 | 0 | odejmowanie modułu mniejszego od większego | jeśli |a| > |b| to znak a jeśli nie to przeciwny |
1 | 1 | odejmowanie modułu mniejszego od większego | jeśli |a| > |b| to znak a jeśli nie to przeciwny |
0 | 1 | sumowanie modułów | 0 |
1 | 0 | sumowanie modułów | 1 |
Podczas mnożenia własności znaku utrzymują swoją moc z tradycyjnego mnożenia: dla takich samych znaków jest plus, a dla różnych znaków minus.
Znak aZM | Znak bZM | Operacja | Znak końcowy |
---|---|---|---|
0 | 0 | mnożenie modułów | 0 |
1 | 1 | mnożenie modułów | 0 |
0 | 1 | mnożenie modułów | 1 |
1 | 0 | mnożenie modułów | 1 |
Podczas dzielenie liczb znak zmienia się tak samo jak podczas mnożenia liczb. Podczas dzielenie należy pamiętać, że nie zawsze dzielenie jest możliwe tak, aby przechować wszystkie informacje.
Znak aZM | Znak bZM | Operacja | Znak końcowy |
---|---|---|---|
0 | 0 | mnożenie modułów | 0 |
1 | 1 | mnożenie modułów | 0 |
0 | 1 | mnożenie modułów | 1 |
1 | 0 | mnożenie modułów | 1 |