Reprezentacja liczb ujemnych

Oczywiście najprościej byłoby przeznaczyć najstarszy bit (o największej wadze) na kodowanie znaku liczby. Przyjmijmy, ze na zapisanie liczby przeznaczamy 4 bity. Wtedy możemy zapisać wartości od 0 do 7. Liczby ujemne powstają poprzez dopisanie w 4 bicie 0 (dodatnia) lub 1 (ujemna).

Liczba Reprezentacja binarna Liczba ujemna Reprezentacja binarna
+0 0000 -0 1000
1 0001 -1 1001
2 0010 -2 1010
3 0011 -3 1011
4 0100 -4 1100
5 0101 -5 1101
6 0110 -6 1110
7 0111 -7 1111



Kod uzupełnieniowy

Aby sprostać oczekiwaniom użytkowników na możliwość sprawnego wykonywania operacji arytmetycznych, powstał sposób zapisu liczb jako kod uzupełnieniowy do jednego. Polega on na zupełnym odwróceniu każdej liczby.

Liczba Reprezentacja binarna Liczba ujemna Reprezentacja binarna
+0 0000 -0 1111
1 0001 -1 1110
2 0010 -2 1101
3 0011 -3 1100
4 0100 -4 1011
5 0101 -5 1010
6 0110 -6 1001
7 0111 -7 1000


Takie podejście do sprawy niezmiernie ułatwia operacje arytmetyczne.


Jest to zapis liczb dokładnie odwrócony z tym wcześniejszym. Rozwiązuje to nasze problemy!


Kod uzupełnieniowy do dwóch (do jednego+1)

Dwuznaczność w reprezentacji liczby 0 w poprzednim zapsie uzupełnieniowym stanowi kolejny problem. Aby temu zaradzić powstał system zapisu do dwóch

0 można więc zapisać jako 0000 lub 1111. System ten polega na dodaniu do każdej ujemnej liczby jedynki. I to rozwiązuje problem z zerem. A w dodatku zostaje nam dodatkowe miejsce w pamięci, co poszerza dolny zakres przedziału liczby o 1.

Liczba Reprezentacja binarna Liczba ujemna Reprezentacja binarna
+0 0000 -8 1000
1 0001 -1 1111
2 0010 -2 1110
3 0011 -3 1101
4 0100 -4 1110
5 0101 -5 1101
6 0110 -6 1010
7 0111 -7 1001

Sposób jest powszechnie używany i dlatego zakresy liczb są nierówne

(np. w C++ zmienna short od -32'768 do 32'767)