Kod uzupełnień do dwóch – podstawy

W przeciwieństwie do systemu binarnego, w kodzie uzupełnień do dwóch (U2) najstarszy bitnajstarszy bitnajstarszy bit ma wagę ujemną. Pozostałe elementy w systemie U2 są takie same jak w klasycznym zapisie binarnym:

Wartość bitów na kolejnych pozycjach

 xIndeks dolny n‑1

 xIndeks dolny n‑2

… 

 xIndeks dolny 1

 xIndeks dolny 0

Waga pozycji w systemie dwójkowym 

 -2Indeks górny n‑1

2Indeks górny n‑2

… 

 2Indeks górny 1

 2Indeks górny 0

W efekcie kod uzupełnień do dwóch pozwala na zapisywanie liczb całkowitych dodatnich oraz ujemnych. W przypadku użycia n bitów zakres wartości liczb całkowitych w systemie U2 mieści się w granicach:

[2n1,2n11]

Zauważmy, że zapis taki jest niesymetryczny. W przypadku liczb ośmiobitowych możemy przedstawić wartości od –128 do +127 (liczba –2Indeks górny 7 nie ma „dodatniego” odpowiednika).

Ważne!

Skoro waga najstarszego bitu liczby jest ujemna, to kiedy jej mnożnik xIndeks dolny n‑1:

  • ma wartość 1 – liczba jest ujemna;

  • ma wartość 0 – liczba jest dodatnia lub równa zero.

Najstarszy bit nazywany jest bitem znakubit znakubitem znaku.

Przekształcanie zapisu U2 do postaci dziesiętnej

Jeżeli chcemy przekształcić do postaci dziesiętnej liczbę zapisaną w kodzie U2, korzystamy ze wzoru poznanego w czasie poprzedniej lekcji. Pamiętajmy, że waga najstarszego bitu jest ujemna.

Wartość liczby zapisanej w systemie U2 {xIndeks dolny n‑1 xIndeks dolny n‑2 ... xIndeks dolny 1 xIndeks dolny 0}Indeks dolny (U2) wynosi:

xn1(2n1)+xn22n2+...+x121+x020
Przykład 1

Przekształćmy do postaci dziesiętnej liczbę 11000011Indeks dolny (U2):

11000011(U2)=1(27)+126+121+120=
=128+64+2+1=61

Ponieważ bit znaku miał wartość 1, otrzymaliśmy liczbę ujemną. Spróbujmy przekształcić do systemu dziesiętnego liczbę, której bit znaku jest równy 0.

Przykład 2

Przekształćmy liczbę 01010100Indeks dolny (U2) do postaci  dziesiętnej:

01010100(U2)=0(27)+126+124+122=
=64+16+4=84

Tym razem otrzymaliśmy liczbę dodatnią.

Zapisywanie liczb w kodzie U2

Chcąc zamienić dodatnią liczbę zapisaną w systemie dziesiętnym na postać w 8‑bitowym kodzie U2, przekształcimy ją najpierw do postaci dwójkowej (postępując według poznanego wcześniej schematu). Otrzymaną liczbę uzupełnia się z lewej strony tyloma zerami, aby powstał ciąg złożony z ośmiu bitów.

Przykład 3

Przedstawmy liczbę 35 zapisaną w kodzie uzupełnień do dwóch:

35=100011(2)=00100011(U2)

Liczba przeciwna

Gdybyśmy chcieli zmienić znak liczby z ostatniego przykładu, możemy zrobić to na dwa sposoby.

I sposób

Zamiana na liczbę przeciwną polega na wykonaniu następujących czynności:

  • zanegowaniu wszystkich bitów liczby (zamiany 1 na 0 oraz 0 na 1),

  • dodaniu 1 do otrzymanej liczby.

Przykład 4

Zamieńmy liczbę 00100011Indeks dolny (U2) w liczbę przeciwną.

  • dokonujemy inwersji (negujemy wszystkie bity):

R15z8JeQQR23p
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
  • do wyniku dodajemy 00000001:

RxPU86VspEmNT
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Liczby 00100011Indeks dolny (U2) oraz 11011101Indeks dolny (U2) mają takie same wartości bezwzględne, ale przeciwne znaki.

II sposób

Dla liczb n‑bitowych wartości przeciwne uzyskujemy, odejmując liczbę od dwukrotnej wagi najstarszego bitu:

22n1=2n
Przykład 5

Zamieńmy liczbę 00100011Indeks dolny (U2) w liczbę przeciwną korzystając z drugiej metody:

R14bKNRAurj8p
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Otrzymaliśmy ten sam wynik co w poprzednim przykładzie.

Działania na liczbach zapisanych w kodzie U2

Operacje dodawania i odejmowania na liczbach zapisanych w kodzie uzupełnień do dwóch wykonuje się tak samo jak na zwykłych liczbach dwójkowych. Mnożenie, dzielenie i pierwiastkowanie są z kolei bardziej skomplikowane i pracochłonne.

Przykład 6

Wykonajmy dodawanie dwóch liczb w systemie U2: 00111010 oraz 10100100:

R1eJ2s2XITTMv
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Przykład 7

Teraz wykonajmy operację odejmowania wykorzystując liczby w U2: 00101011 oraz 11100100:

RybzDaNmVOZ9W
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Zauważmy, że w przypadku odejmowania dwóch najstarszych bitów możemy „zapożyczyć” 10Indeks dolny (2) z lewej strony, poza zapisanymi liczbami. Dzieje się tak ponieważ najstarszy bit to bit znaku – umożliwia nam to przekształcenie odejmowania liczby ujemnej na dodawanie liczby dodatniej. Taki sam wynik otrzymalibyśmy, gdybyśmy zamienili liczbę odejmowaną na liczbę dodatnią, po czym zapisali działanie jako dodawanie.

Słownik

najstarszy bit
najstarszy bit

bit mający największą wagę (w słowie maszynowym wysunięty najbardziej w lewo); nazywany również najbardziej znaczącym bitem liczby

bit znaku
bit znaku

w kodzie binarnym najbardziej znaczący bit liczby, decydujący o znaku liczby