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 (W ∈ N, 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:
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) =
Jak widać dla m ∈ N, m ≠ 0 dzięki powyższemu faktowi możemy zdefiniować odwzorowanie : Z \ {0} → <0,W−1>* wzorem (m) = anak...a0 ∈ <0,W−1>*. Jeśli przyjmiemy dodatkowo, że (0) = 0 ∈ <0,W−1>*, to określimy odwzorowanie
nazywane kodem uzupełnień do W.
1. Jeśli an = 0 (tzn. słowa kodowe są postaci 0an-1an-2...a0) to liczba jest nieujemna
2. Jeśli an = 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 m ∈ Z i słowo anan-1...a0 reprezentuje 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 (W ∈ N, 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:
Dowód: Prosty dowód pozostawiamy Czytelnikowi jako ćwiczenie.
Odwzorowanie :<−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...a0 reprezentuje 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
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.