Zapis liczb binarnych ze
znakiem
Prezentacje przygotował:………….
Dotychczas opisany sposób kodowania dwójkowego
umożliwia przedstawianie liczb dodatnich i zera. Z
drugiej strony wiemy, jak ważne w zastosowaniach
są liczby ujemne. W systemie dziesiętnym sprawę
rozwiązaliśmy przez wprowadzenie znaku przed
zapisem cyfr liczby. Jeśli liczby chcemy przetwarzać
za pomocą komputera, to mamy do dyspozycji
jedynie bity o wartościach 0 lub 1. Bity mogą
kodować cyfry dwójkowe, ale brakuje tutaj wartości
dla znaku '+' lub '-'.
Niestety musimy odejść nieco od naturalnego
systemu dwójkowego i wprowadzić kilka
dodatkowych ustaleń.
Kodowanie liczb dodatnich i ujemnych opiera się
na stałym formacie zapisu liczby. Oznacza to, iż z
góry ustala się liczbę cyfr używanych do zapisu
wartości, np. 8, 16, 24, 32, ... Jeśli wybierzemy
jeden format, to musimy się go ściśle trzymać.
Najstarsza cyfra dwójkowa (bit) ma inne znaczenie
niż reszta cyfr i pełni funkcję bitu znaku. Jeśli bit
ten ma wartość 0, to liczba jest dodatnia. Jeśli ma
wartość 1, to liczba jest ujemna. W ten sposób
kodujemy nasze znaki + i -.
Istnieją dwa główne sposoby kodowania liczb ze
znakiem - kod ZNAK-MODUŁ, kod U2.
Znak-Moduł
W systemie tym stosujemy bardzo prostą metodę kodowania
liczb ze znakiem. Najstarszy bit liczby jest bitem znaku.
Reszta bitów określa wartość bezwzględną (moduł) liczby:
Jeśli przyjmiemy do zapisu liczb format całkowity n-bitowy,
to liczby w kodzie znak-moduł mają następującą postać:
znak moduł
a
n-1
a
n-2
... a
1
a
0
Wartość n-bitowej, całkowitej liczby w dwójkowym kodzie
znak-moduł obliczamy wg wzoru:
n-2
a
n-1
a
n-2
... a
1
a
0
= (1 - 2 * a
n-1
) *
Σ
a
i
* 2
i
i=0
Wyrażenie (1 - 2 x bit znaku) przyjmuje
odpowiednio wartość 1, gdy bit znaku jest
równy 0, a -1, gdy bit znaku ma wartość 1,
czyli określa liczbę ujemną. W dalszej części
wzoru mamy obliczanie wartości pozostałych
bitów, czyli modułu. Moduł jest przemnażany
przez wyrażenie znakowe i w efekcie
otrzymujemy wartość dodatnią lub ujemną w
zależności od stanu bitu znaku.
Przykład 1:
n = 4 bity
0110
ZM
= (1 - 2 * 0) * (0 * 2
0
+ 1 * 2
1
+ 1 * 2
2
)
0110
ZM
= (1 - 2 * 0) * (0 * 1 + 1 * 2 + 1 * 4)
0110
ZM
= 1 * ( 2 + 4)
0110
ZM
= 6
D
1011
ZM
= (1 - 2 * 1) * (1 * 2
0
+ 1 * 2
1
+ 0 * 2
2
)
1011
ZM
= (1 - 2 * 1) * (1 * 1 + 1 * 2 + 0 * 4)
1011
ZM
= -1 * (1 + 2)
1011
ZM
= -3
D
Przykład 2:
Przedstawić wartość -69 w 8-bitowym kodzie znak-moduł.
1. Znajdujemy przedstawienie dwójkowe modułu
69 / 2 = 34 i reszta 1
34 /2 = 17 i reszta 0
17 / 2 = 8 i reszta 1
8 / 2 = 4 i reszta 0
4 / 2 = 2 i reszta 0
2 / 2 = 1 i reszta 0
1 / 2 = 0 i reszta 1
69
D
= 1000101
B
2. Otrzymaną liczbę dwójkową uzupełniamy bitem znaku
i otrzymujemy:
-69
D
= 11000101
ZM
Zakres n-bitowych liczb w kodzie ZM
Zakres liczb ZM wynika bezpośrednio ze wzoru
obliczeniowego. Wartość maksymalną otrzymamy przy
znaku dodatnim i maksymalnym module. Wartość
minimalną otrzymamy przy znaku ujemnym i również
maksymalnym module. Ponieważ moduł jest o jeden bit
mniejszy niż wynosi długość liczby Z-M, to:
max
ZM
= 2
n-1
- 1, min
ZM
= -2
n-1
+ 1
dla n=8 -> max
ZM
= 127, min
ZM
= -127
W kodzie ZM można na dwa sposoby zapisać wartość 0, raz z
bitem znaku 0, i raz z bitem znaku 1, np. dla n=4:
0000
ZM
= 0 (zero dodatnie)
1000
ZM
= 0 (zero ujemne, ale też zero)
U2
Wniosek z zapisu liczb w kodzie ZM jest pesymistyczny.
Wymyśliliśmy sposób kodowania liczb ze znakiem,
który sprawia kłopoty przy obliczeniach. Nie może
być inaczej, ponieważ bit znaku jest sztucznie
dołączony do reszty bitów tworzących wartość liczby.
Wykonywanie podstawowych działań arytmetycznych
na liczbach prowadzący do poprawnych wyników jest
możliwe dzięki Kodowi Uzupełnień do 2 (lub
Uzupełnień do Podstawy), w skrócie U2. Budowa
liczby w kodzie U2 jest podobna do kodu znak-moduł.
Jednak teraz pozycja znakowa (najstarszy bit)
posiada swoją wagę i uczestniczy w wartości liczby
jak każda inna pozycja.
Waga pozycji znakowej jest ujemna:
znak moduł
a
n-1
a
n-2
... a
1
a
0
-2
n-1
2
n-2
... 2
1
2
0
Wartość n-bitowej liczby zapisanej w kodzie U2
obliczamy w standardowy sposób: sumując kolejne
iloczyny cyfr przez wagi pozycji.
n-2
a
n-1
a
n-2
... a
1
a
0
= a
n-1
*
(- 2
n-1
) +
Σ
a
i
* 2
i
i=0
Przykład:
n = 4 bity
0110
U2
= 0 * (-2
3
) + 0 * 2
0
+ 1 * 2
1
+ 1 * 2
2
0110
U2
= 0 * (-8) + 0 * 1 + 1 * 2 + 1 * 4
0110
U2
= 2 + 4
0110
U2
= 6
D
1110
U2
= 1 * (-2
3
) + 0 * 2
0
+ 1 * 2
1
+ 1 * 2
2
1110
U2
= 1 * (-8) + 0 * 1 + 1 * 2 + 1 * 4
1110
U2
= -8 + 2 + 4
1110
U2
= -2
Zapis liczb ujemnych
Musimy rozpatrzyć dwa przypadki:
1. Liczba jest dodatnia - znajdujemy jej przedstawienie
binarne i uzupełniamy zerami do przyjętego formatu.
Na przykład przyjmijmy format 4-bitowy i zapiszmy
w nim wartość 3:
3
D
= 11
B
Ponieważ format ma 4 bity, to dodajemy na początku
dwie cyfry 0 i otrzymujemy liczbę dodatnią w kodzie
U2:
3
D
= 0011
B
2. Liczba jest ujemna. W tym przypadku bit znaku musi
mieć wartość 1. Ponieważ stoi on na pozycji o wadze
-2
n-1
, a reszta liczby jest dodawana do tej wagi, to
musimy znaleźć taką wartość, która dodana do wagi
bitu znaku da nam liczbę kodowaną. Wartość tę
kodujemy na pozostałych bitach. Np. zakodujmy liczbę
-3 w 4-bitowym kodzie U2. Bit znaku ma wartość -2
3
,
czyli -8. Aby otrzymać -3, do -8 musimy dodać liczbę
5 i tę wartość kodujemy na pozostałych bitach:
-8 + 5 = -3
1101
U2
= -3
D
Możemy również znaleźć przedstawienie modułu tej
liczby, a następnie wyliczyć wartość przeciwną w
kodzie U2 wg przepisu:
1.
Aby znaleźć wartość przeciwną w kodzie U2 należy
wykonać następujące czynności: zamienić
wszystkie bity liczby na przeciwne, tzn. 1 na 0 i 0
na 1
2.
Do tak otrzymanej liczby dodać wartość 1
Czyli w naszym przykładzie najpierw znajdujemy zapis dwójkowy
liczby 3:
3
D
= 11
B
Następnie uzupełniamy cyfry do 4 bitów: 3
D
= 0011
U2
Teraz postępujemy zgodnie z opisaną metodą: zamieniamy bity
na przeciwne i dodajemy 1
0011
U2
= 3
D
1100
+ 0001
1101
U2
= -3
D
Otrzymaliśmy identyczną liczbę, jak poprzednio.
Zakres n-bitowych liczb w kodzie U2
Największą wartość otrzymamy, gdy bit znaku ma stan 0, a reszta
bitów liczby ma stan 1. Ponieważ dla n-bitowego formatu U2
bitych o wartości 1 jest n-1, to
max
U2 n-bitów
= 2
n-1
- 1
A więc tyle samo co w kodzie ZM. Najmniejszą wartość ujemną
otrzymamy, gdy bit znaku przyjmie stan 1, a reszta bitów będzie
miała stan 0 - najmniejszą wartością liczby w kodzie U2 jest waga
pozycji znakowej.
min
U2 n-bitów
= -2
n-1
Dla n = 8 otrzymamy: max
U2 8b
= 127, min
U2 8b
= -128
Zwróćcie uwagę, iż górna i dolna granica liczb są niesymetryczne. W
kodzie U2 każda kombinacja kodowa odpowiada dokładnie jednej
liczbie - zero nie powtarza się, jak w kodzie Z-M. Jest to więc kod
efektywny.
Dziękujemy za uwagę.