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.
(w 16 bitowym kodzie NKB). Ponieważ –1<0 obliczamy uzupełnienie do 2 słowa
(15 zer i jedynka na końcu) i uzyskujemy ostatecznie
. Czyli -1 to 16 jedynek.


