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)