Podręcznik

2. Kody numeryczne i arytmetyka cyfrowa

2.8. Zapis uzupełnień do W i zapis uzupełnień do 2

Dokładniej, omówimy zapis uzupełnień do W (kod numeryczny uzupełnień do W) dla liczb całkowitych n ∈ Z (a więc również ujemnych). Wykorzystamy następujący fakt.

Fakt: Wybierzmy dowolne m ∈ Z, m ≠ 0 i ustalmy wagę W (WN, W ≥ 2). Wówczas istnieje dokładnie jeden ciąg: anan-1...a0, gdzie n > 0, taki że dla każdego i = 1,2,...n−1 ai ∈ {0,1,...W−1}, an ∈ {0,1,...W−1}, oraz an = 0 i an-1 ≠ 0 i lub an = 1 taki, że:

n = -(\text{sgn } a_n)W^n + \displaystyle\sum_{i=0}^{n-1}a_iW^i\qquad(*)

Dowód: Prosty dowód pozostawiamy Czytelnikowi jako ćwiczenie.

Dla przypomnienia: funkcja sgn: R → {−1,0,1} (tzw. funkcja signum, czyli znak),

zdefiniowana jest dla wzorem: sgn(x) = \left\{ \begin{array}{ll} { \text{1 gdy x > 0} \\ \text{0 gdy x = 0}\\\text{-1 gdy x < 0}} \end{array} \right.

Jak widać dla mN, m ≠ 0 dzięki powyższemu faktowi możemy zdefiniować odwzorowanie f: Z \ {0} → <0,W−1>* wzorem f (m= anak...a∈ <0,W−1>*. Jeśli przyjmiemy dodatkowo, że f (0) = 0 ∈ <0,W−1>*, to określimy odwzorowanie

f → <0,W−1>*

nazywane kodem uzupełnień do W.

Widać od razu, że współrzędna n (a dokładniej an) określa znak reprezentowanej liczby.

1. Jeśli a= 0 (tzn. słowa kodowe są postaci 0an-1an-2...a0) to liczba jest nieujemna

2. Jeśli a= W−1 (tzn. słowa kodowe są postaci (W−1)an-1an-2...a0) to liczba jest nieujemna

Algorytm obliczania liczby przeciwnej do danej jest w zapisach uzupełnień do W jest następujący. Jeśli mi słowo anan-1...areprezentuje tę liczbę to słowo reprezentujące −m uzyskujemy jako uzupełnienie do W słowa anan-1...a0.

Powyżej zdefiniowany kod uzupełnień do W jest kodem o zmiennej długości słowa kodowego. Zdefiniujemy teraz kod uzupełnień do W o stałej długości słowa kodowego.

Wykorzystamy następujący fakt:

Fakt: Wybierzmy dowolne m ∈ <−Wn,Wn−1>, gdzie n > 0 i ustalmy wagę W (WN, W ≥ 2). Wówczas istnieje dokładnie jeden ciąg: anan-1...a0, taki że dla każdego i = 1,2...,n, ai ∈ {0,1,...,<i>W</i>−1} taki, że:

n = −(sgn an)W\displaystyle\sum^{n-1}_{i=0}a_iW^i\qquad(*)

Dowód: Prosty dowód pozostawiamy Czytelnikowi jako ćwiczenie.

Odwzorowanie f :<Wn,Wn−1>→<0,W−1>n zdefiniowane w powyższym twierdzeniu nosi nazwę zapisu uzupełnień do W (o stałej długości słowa kodowego).

Zakres tak zdefiniowanego kodu jest równy oczywiście <Wn,Wn−1>.

Algorytm obliczania liczby przeciwnej do danej jest w zapisach uzupełnień do W (o stałej długości) jest następujący. Jeśli m ∈ <−Wn,Wn−1> i słowo anan-1...areprezentuje tę liczbę to słowo reprezentujące  −m uzyskujemy jako uzupełnienie do W słowa anan-1...a0.

W systemach cyfrowych stosujemy głównie zapis uzupełnień do 2 (ang. two`s complement notation), który nazywany jest również zapisem U2. Jest to obok zapisu NKB najczęściej stosowany w technice mikroprocesorowej kod numeryczny. Popularność zapisu U2 wynika m.in. z faktu, że algorytmy dodawania i odejmowania w U2 dają się zrealizować a sposób naturalny w zwykłym, prostym sumatorze sumującym liczby w kodzie NKB.

W kodzie U2 (o stałej długości słowa n+1) słowo binarne anan-1...a0 związane jest z reprezentowaną tym słowem liczbą za pomocą wzoru

n = −(sgn an)2\displaystyle\sum^{n-1}_{i=0}a_i2^i = −an2n \displaystyle\sum^{n-1}_{i=0}a_i2^i

a zakres reprezentowanych liczb jest równy <−2n,2n−1>

Bit an nazywamy bitem najbardziej znaczącym lub bitem MSB od ang. Most Significant Bit) a bit a0 bitem najmniej znaczącym lub bitem LSB od ang. Least Significant Bit.

W zapisie U2, żeby obliczyć –m mając kod U2 liczby m (czyli rozwinięcie, jak czasem mówimy) negujemy wszystkie bity i na najmniej znaczącej pozycji dodajemy arytmetycznie 1 (tzn. z uwzględnieniem przeniesień). Uzyskany wynik, tzn. słowo binarne reprezentuje tzn. jest kodem U2 liczby –m. Jest to bardzo wygodny algorytm ale uwaga –m musi należeć do zakresu zapisu.

Przykład: Zapiszmy liczbę –5 w 8 bitowym zapisie uzupełnień do 2 (tzn. ze słowem kodowym o długości 8). Liczbę 5 zapisujemy wstępnie jako słowo 8 bitowe 00000101 (w 8 bitowym kodzie NKB). Ponieważ –5<0 obliczamy uzupełnienie do 2 słowa 00000101 i uzyskujemy ostatecznie 11111011.
Przykład: Zapiszmy liczbę –1 w 16 bitowym zapisie uzupełnień do 2 (tzn. ze słowem kodowym o długości 8). Liczbę 1 zapisujemy wstępnie jako słowo 16 bitowe \underset{n+1}{\underbrace{00...1}} (w 16 bitowym kodzie NKB). Ponieważ –1<0 obliczamy uzupełnienie do 2 słowa \underset{15}{\underbrace{00...001}} (15 zer i jedynka na końcu) i uzyskujemy ostatecznie \underset{16}{\underbrace{11...1}}. Czyli -1 to 16 jedynek.