Liczby binarne ze znakiem i kod U2 (Uzupełnień do Dwóch): Standard procesorów
W dotychczasowych rozważaniach operowaliśmy na tzw. liczbach bez znaku (unsigned), które mogą przyjmować wyłącznie wartości dodatnie lub zero. Jednak w rzeczywistych systemach informatycznych i procesorach konieczna jest obsługa temperatur ujemnych, sald ujemnych czy ujemnych współrzędnych graficznych. W ramach przedmiotu UTK (Urządzenia Techniki Komputerowej) zrozumienie sposobu, w jaki procesor reprezentuje liczby ujemne za pomocą kodu U2, jest absolutnym kluczem do zrozumienia architektury jednostki arytmetyczno-logicznej (ALU).
1. Problem reprezentacji liczb ze znakiem i kod U1
Przed wprowadzeniem współczesnych standardów inżynierowie próbowali stosować prostsze metody zapisu liczb ujemnych:
- Znak-moduł (Sign-Magnitude): Najstarszy bit (MSB – najbardziej znaczący po lewej) rezerwowano na znak (0 = plus, 1 = minus), a pozostałe bity określały wartość bezwzględną. Metoda ta miała poważną wadę: istniały dwa reprezentacje zera (plus zero i minus zero), a układy dodające musiałyby być skomplikowane.
- Kod Uzupełnień do Jednego (U1 / One's Complement): Liczbę ujemną tworzono poprzez prostą negację (zamianę wszystkich bitów 0 na 1 i odwrotnie) liczby dodatniej. Nadal jednak istniał problem dwóch zer oraz trudności w arytmetyce sprzętowej.
2. Kod Uzupełnień do Dwóch (U2 / Two's Complement)
Aby wyeliminować wady poprzednich systemów, współczesna technika cyfrowa powszechnie stosuje kod U2:
- Określenie znaku (Bit MSB): Najbardziej znaczący bit (skrajny lewy) zawsze decyduje o znaku liczby:
0– oznacza liczbę dodatniczą (lub zero).1– oznacza liczbę ujemną.
- Zakres 8-bitowego rejestru w U2: W zapisie na 8 bitach możemy zakodować liczby z zakresu od $-128$ do $+127$ (wzór: od $-2^{n-1}$ do $2^{n-1}-1$).
3. Algorytm wyznaczania liczby ujemnej w kodzie U2
Aby zapisać ujemną wartość dziesiętną (np. $-5$) w postaci binarnej U2 na 8 bitach, wykonujemy dwa kroki:
- Krok 1: Zapisujemy wartość dodatnią tej liczby w systemie binarnym na określonej liczbie bitów (np. $+5$ na 8 bitach to
00000101). - Krok 2: Negujemy wszystkie bity (zamieniamy 0 na 1, a 1 na 0 – uzyskujemy kod U1, czyli
11111010). - Krok 3: Dodajemy do uzyskanego wyniku wartość
1(zgodnie z zasadami dodawania binarnego):11111010 + 00000001 ---------- 11111011 (wynik: reprezentacja liczby -5 w kodzie U2)
4. Dlaczego kod U2 jest rewolucyjny dla procesorów?
Największą zaletą kodu U2 jest fakt, że procesor nie potrzebuje osobnego układu do odejmowania:
Operacja odjmowania (np. $A - B$) jest wewnątrz jednostki ALU automatycznie zamieniana na dodawanie liczby ujemnej ($A + (-B)$ w kodzie U2). Dzięki temu ten sam fizyczny układ sumatora cyfrowego obsługuje zarówno dodawanie, jak i odejmowanie liczb zarówno dodatnich, jak i ujemnych.
Strategia technika
Projektując niskopoziomowe oprogramowanie dla mikrokontrolerów lub analizując pakiety sieciowe i struktury danych, zawsze zwracaj uwagę na deklarację typu zmiennej (np. signed int kontra unsigned int). Pomylenie liczby ze znakiem (U2) z liczbą bez znaku podczas interpretacji surowych bajtów z czujników lub pamięci prowadzi do drastycznych błędów odczytu dużych wartości ujemnych traktowanych jako gigantyczne liczby dodatnie.