Operacje arytmetyczne na liczbach binarnych: Dodawanie, odejmowanie i kodowanie ujemne
Procesory i układy cyfrowe nie potrafią liczyć w systemie dziesiętnym tak jak ludzie – wszystkie obliczenia matematyczne, począwszy od prostych adresów pamięci, a skończywszy na skomplikowanej grafice 3D i sztucznej inteligencji, są wykonywane w systemie binarnym. W ramach przedmiotu UTK (Urządzenia Techniki Komputerowej) przyszły technik musi rozumieć mechanizmy dodawania, odejmowania oraz sposoby reprezentacji liczb ze znakiem wewnątrz procesora.
1. Dodawanie liczb binarnych
Dodawanie w systemie dwójkowym opiera się na prostych regułach sumowania bitów, analogicznie do systemu dziesiętnego, z tą różnicą, że przekroczenie wartości 1 powoduje przeniesienie jedynki ($1 + 1 = 10$, czyli 0 z przeniesieniem 1 na następną pozycję):
- Podstawowe reguły dodawania bitów:
- $0 + 0 = 0$
- $0 + 1 = 1$
- $1 + 0 = 1$
- $1 + 1 = 0$ (i przeniesienie 1 w pamiątkę / na wyższą pozycję)
- $1 + 1 + 1 = 1$ (i przeniesienie 1)
- Przykład dodawania (np. $5_{10} + 3_{10}$, czyli $0101_2 + 0011_2$):
0101 (5) + 0011 (3) ------ 1000 (8)
2. Odejmowanie liczb binarnych
Odejmowanie można realizować tradycyjną metodą "pożyczania" jedynki z starszej pozycji lub – co jest standardem we współczesnych procesorach – poprzez zamianę odejmowania na dodawanie z użyciem ujemnych kodów liczbowych:
- Podstawowe reguły odejmowania bitów:
- $0 - 0 = 0$
- $1 - 0 = 1$
- $1 - 1 = 0$
- $0 - 1 = 1$ (z pożyczeniem 1 z wyższej pozycji)
3. Reprezentacja liczb ujemnych (Kod Uzupełnień do Dwóch – U2)
W elektronice cyfrowej konieczne jest przechowywanie zarówno liczb dodatnich, jak i ujemnych. Najpopularniejszym standardem jest kod U2 (Two's Complement):
- Zasada działania kodu U2: Najbardziej znaczący bit (MSB – bit po lewej stronie) określa znak liczby:
0oznacza liczbę dodatnią, natomiast1oznacza liczbę ujemną. - Wyznaczanie liczby ujemnej w U2: Aby zapisać liczbę ujemną (np. $-5$), należy wziąć jej odpowiednik dodatni w postaci binarnej, zanegować wszystkie bity (zamienić 0 na 1 oraz 1 na 0 – tzw. kod U1), a następnie dodać do uzyskanego wyniku wartość
1. - Zaleta kodu U2: Umożliwia procesorowi wykonywanie odejmowania za pomocą zwykłego sumatora arytmetycznego (dodawanie liczby ujemnej zastępuje odejmowanie), co drastycznie upraszcza strukturę fizyczną jednostki ALU (Arithmetic Logic Unit).
Strategia technika
Podczas analizy działania procesora lub pisania niskopoziomowego kodu (np. w mikrokontrolerach), zawsze pamiętaj o szerokości bitowej rejestru (np. 8-bit, 16-bit, 32-bit). Przekroczenie zakresu liczbowego (tzw. overflow / przepełnienie bufora), gdy wynik dodawania dwóch dużych liczb nie mieści się w wyznaczenej liczbie bitów, prowadzi do błędów logicznych, które są jedną z najczęstszych przyczyn awarii oprogramowania i podatności bezpieczeństwa.