Liczby ze znakiem w systemie binarnym: znak i dopełnienie dwójkowe
Poznaj reprezentacje liczb ze znakiem w systemie binarnym: znak i wielkość vs dopełnienie dwójkowe — zasady, zalety i praktyczne przykłady obliczeń.
Reprezentacje liczb ze znakiem (signed) służą do przedstawiania wartości ujemnych w systemie binarnym. Problem z „doklejeniem” zwykłego znaku minus do ciągu bitów polega na tym, że bit nie rozróżnia, czy jest częścią wartości (cyfrą), czy oddzielnym znakiem — potrzeba spójnej konwencji, która pozwoli wykonywać operacje arytmetyczne bez dodatkowego rozpoznawania znaków. Aby rozwiązać ten problem, projektanci komputerów opracowali kilka metod kodowania liczb ze znakiem. Dwie najważniejsze to znak i wielkość (sign-and-magnitude) oraz dopełnienie dwójkowe (two’s complement). Poniżej znajduje się porównanie tych metod oraz praktyczne wskazówki.
1. Znak i wielkość (sign-and-magnitude)
- Format: najstarszy bit (MSB) jest bitem znaku (0 = dodatnia, 1 = ujemna), pozostałe bity reprezentują wartość bezwzględną (magnitude).
- Przykład (4 bity):
- +5 = 0101 (0 = znak dodatni, 101 = 5)
- -5 = 1101 (1 = znak ujemny, 101 = 5)
- Zasięg przy n bitach: od -(2^(n-1)-1) do +(2^(n-1)-1). Dla 4 bitów: zakres to -7 do +7, ale zero występuje w dwóch postaciach: +0 (0000) i -0 (1000).
- Zalety: intuicyjny sposób zapisu, prosty do odczytu znaku.
- Wady: dwa zera (zajmują reprezentacje), skomplikowana arytmetyka (dodawanie i odejmowanie wymaga uwzględniania znaku osobno), mniej wygodny dla jednostek arytmetycznych procesora.
2. Dopełnienie dwójkowe (two’s complement)
- Format: liczby dodatnie kodowane standardowo binarnie, liczby ujemne kodowane poprzez odjęcie ich bezwzględnej wartości od 2^n (lub: zanegowanie bitów i dodanie 1).
- Jak uzyskać reprezentację liczby ujemnej (np. -5) w n bitach:
- Weź binarną reprezentację wartości bezwzględnej (np. 5 = 00000101 w 8 bitach).
- Zaneguj wszystkie bity (one’s complement): 11111010.
- Dodaj 1: 11111010 + 1 = 11111011 — to jest dopełnienie dwójkowe liczby -5 w 8 bitach.
- Przykłady (8 bitów):
- +5 = 00000101
- -5 = 11111011
- Zasięg przy n bitach: od -2^(n-1) do 2^(n-1)-1. Dla 8 bitów: od -128 do +127. Zero ma jedną reprezentację (wszystkie zera).
- Zalety: prosta arytmetyka binarna — dodawanie i odejmowanie działa identycznie dla liczb ze znakiem i bez, wystarczy ignorować przeniesienie wyjściowe (carry out). Brak podwójnego zera. Powszechnie stosowane we współczesnych procesorach.
- Wady: asymetryczny zakres (jedno dodatkowe negatywne maksimum, np. -128 w 8 bitach), co może wymagać uwagi przy negowaniu największej wartości.
3. Właściwości praktyczne i porównanie
- Arytmetyka: dopełnienie dwójkowe upraszcza implementację dodawania/odejmowania w układach cyfrowych — ta sama jednostka ALU potrafi dodawać liczby ze znakiem bez specjalnego rozpoznawania znaku.
- Reprezentacja zera: sign-and-magnitude i one’s complement mają dwa zera (+0 i -0), dopełnienie dwójkowe ma tylko jedno (0), co upraszcza porównania i normalizację danych.
- Overflow: w dopełnieniu dwójkowym przepełnienie wykrywa się, gdy przy dodawaniu dwóch liczb ze znakiem otrzymamy różne znaki operandów a wynik ma inny znak niż operandy (lub bardziej formalnie: gdy przeniesienie do bitu znaku i przeniesienie poza bit znaku różnią się). W sign-and-magnitude wykrywanie przepełnienia jest inne i bardziej skomplikowane.
- Rozszerzanie bitów (sign extension): w dopełnieniu dwójkowym przedłużanie liczby do większej szerokości polega na powieleniu bitu znaku (wypełnianie nowo dodanych najwyższych bitów kopią bitu znaku). Dzięki temu wartość liczby się nie zmienia. To samo trzeba zrobić ostrożnie w sign-and-magnitude (należy powielić bit znaku i odpowiednio dopasować bity wielkości).
4. Krótkie wzory i przypomnienia
- Do zamiany x (dodatnie) na -x w dopełnieniu dwójkowym: zaneguj wszystkie bity i dodaj 1.
- Zakresy: sign-and-magnitude: -(2^(n-1)-1) … +(2^(n-1)-1) (dwa zera); two’s complement: -2^(n-1) … 2^(n-1)-1 (jedno zero).
- W praktycznych zastosowaniach: dopełnienie dwójkowe jest standardem w większości współczesnych systemów komputerowych.
Podsumowując, obie reprezentacje rozwiązują problem przedstawiania ujemnych liczb w systemie binarnym, ale dopełnienie dwójkowe jest zwykle bardziej użyteczne z punktu widzenia sprzętowej realizacji arytmetyki i dlatego dominuje w praktyce. Zrozumienie różnic pomaga w analizie zachowania programów niskopoziomowych, debugowaniu błędów przepełnienia i pracy z systemami o ograniczonej szerokości słowa.
Znak i magnitudo
Sign and Magnitude działa poprzez zmianę najbardziej znaczącego bitu (MSB - pierwsza cyfra) na 1, jeśli liczba jest ujemna, i zmniejszenie liczby o jeden, na przykład:
0000 0010 (2)
stanie się...
1000 0010 (-2)
Ta metoda przechowywania ujemnych liczb binarnych nie działa, ponieważ:
- Arytmetyka binarna nie będzie działać.
- Musimy najpierw wiedzieć, jakiego mechanizmu przechowywania danych używa kompilator danego języka.
1's complement
Komplementarność 1's działa poprzez zamianę 1s na 0s i 0s na 1s, na przykład:
0000 0010 (2)
stanie się...
1111 1101 (-2)
Podobnie jak w metodzie znak-i-magnitudo, jest to łatwo zdefiniowane jako liczba ujemna, ponieważ jej najbardziej znaczący bit jest 1.
2's complement
Dopełnienie 2 jest trudniejszym sposobem przechowywania negatywów. Składa się on z trzech kroków:
- Znajdź dodatnią liczbę binarną (np. 8base 10 = 0000 1000base 2).
- Zamień 1s na 0s, a 0s na 1s (np. 0000 1000base 2 staje się 1111 0111base 2).
Jest to znane jako "odwracanie bitów", lub zastosowanie logicznego NOT do oryginalnej reprezentacji bazy 2.
- Dodać 1 (np. 1111 0111baza 2 + 1baza 2 = 1111 1000baza 2).
Ta metoda jest lubiana, ponieważ:
- To jest jak znak i wielkość; liczba ujemna zaczyna się od 1, a liczba dodatnia od 0.
- Arytmetyka binarna będzie działać.
- Istnieje tylko jedna wartość dla 0 (0000 0000base 2).
Przeszukaj encyklopedię