W poprzedniej części cyklu pokazałem jak zamieniać liczby zwykłe na binarne i odwrotnie. Tylko co w przypadku, gdy chcemy w ten sposób przedstawić liczbę ujemną. Jeśli chcesz się dowiedzieć to rozwiń tego posta.
Przejdźmy więc do sedna. Tak naprawdę to liczby binarne ujemne dla komputera nie istnieją tak jak właściwie nie istnieją nawet liczby ujemne w systemie dziesiętnym. Komputer gdy napotyka liczbę ujemną zapisaną w jakimś programie w systemie dziesiętnym to po prostu widząc znak '-' traktuje odpowiednia tą liczbę tak jakby była ona ujemna.
W zapisie dwójkowym jest nieco trudniej, nie ma jednego skonkretyzowanego sposobu zapisu tych liczb tak jak to jest w przypadku naturalnego nam systemu. Najczęściej spotykane są trzy metody przedstawiania tych liczb, lecz jeśli piszesz program to możesz tak naprawdę wymyślić nawet własną. To tylko kwestia odpowiedniej implementacji.
Metoda bitu znaku:
Zacznijmy może od najprostszej, takiej którą ja nazywam metodą bitu znaku (inna spotykana nazwa to metoda ZW - znak-moduł, ale ja uważam, że jest ona mało chwytliwa). Jest najłatwiejsza do zrozumienia gdyż polega ona jedynie na tym, że bit najbardziej po lewej stronie:
10000001 - tak wyglądałoby to stosując zapis 8 bitowy.
1001 - a tak zapis 4 bitowy.
1001 - a tak zapis 4 bitowy.
Traktowany jest jako bit przechowujący informację o tym, czy liczba jest ujemna, czy też dodatnia. Odpowiednio jedynka oznacza liczbę ujemną a zero dodatnią. Inaczej: gdy widzisz 0 to nie ma minusa a gdy widzisz 1 to ten minus jest.
Reszta zapisu to po prostu zwykły zapis dwójkowy liczby 1. Czyli powyższy zapis, uwzględniając bit znaku, jest liczbą -1.
Reszta zapisu to po prostu zwykły zapis dwójkowy liczby 1. Czyli powyższy zapis, uwzględniając bit znaku, jest liczbą -1.
Jest to więc jak widzisz banalnie proste. Problemem tej metody jest to, że zapis nie jest jednolity i ciężko jest wykonywać operacje arytmetyczne (o których napiszę później) na takich zapisach. Dodatkowo ograniczamy możliwości zapisania liczby, mianowicie potrzebujemy 8 bitów aby zapisać 7 bitową liczbę itd. . Dzieje się to dlatego, że potrzebujemy miejsca na zapisanie tego dodatkowego znaku.
Metoda uzupełnień do 1 - U1:
W metodzie tej stosujemy zapis podobny do metody znak-moduł z zastrzeżeniem, że bit znaku w tym wypadku posiada wagę. Oznacza to, że można go przeliczyć, a wynik da nam odpowiednią liczbę.
Zapis binarny liczby -1 uzyskujemy w zapisując liczbę 1 za pomocą systemu dwójkowego, a następnie negując wszystkie bity tej liczby. Przykład, stosując zapis bitowy:
0001 - liczba 1 zapisana w systemie dwójkowym
1110 - liczba -1 zapisana w kodzie U2 (przy czym pierwszy bit jest bitem znaku)
Mała dygresja. Przed chwilą wspomniałem, że bit znaku posiada wagę, zapewne zastanawiasz się o co w tym chodzi. Otóż, normalny, czyli nie wykorzystujący Schematu Hornera (znowu on, obiecuje, że niedługo go wyjaśnię), sposób obliczeń wygląda, dla przypomnienia, w ten sposób:
0 * 23 + 0 * 22 + 0 * 21 + 1 * 20
= 0 + 0 + 0 + 1
Waga każdego bitu w tym wypadku: 2n-1 , przy czym n oznacza pozycję danego bitu. W przypadku metody U1, waga ta zmienia się dla pierwszego bitu. Waga bitu znaku wynosi w niej (1 - 2n-1). Schemat obliczeń liczby -1 wyglądałby więc następująco:
(1 * 1 - 23) + 1 * 22 + 1 * 21 + 0 * 20 = -7 + 4 + 2 + 0 = -1
Jak widać, bit znaku spełnia swoją rolę i jako wynik otrzymaliśmy -1. Lecz nadal trzeba pamiętać, że komputer musi wiedzieć iż ma do czynienia z liczbą ujemną gdyż w przeciwnym wypadku przeliczy tę liczbę jako:
1 * 23 + 1 * 22 + 1 * 21 + 0 * 20 =
8 + 4 + 2 + 0 = 14
System ten ma jednak problem zera ujemnego i dodatniego. Mianowicie obie wartości: 1111 i 0000 po zamianie na system dziesiętny dają ten sam wynik czyli: 0. W niektórych przypadkach może to prowadzić do kłopotliwych sytuacji.
Metoda uzupełnień do 2 - U2:
Metoda U2 jest często stosowaną metodą zapisu ujemnych liczb binarnych. Polega na przepisywaniu bitów od prawej, do momentu napotkania bitu o wartości 1. Ten bit także jest przepisywany, a wartości następnych bitów poddaje się negacji: zamiast 1 piszemy 0 a zamiast 0 - 1.
Bit znaku również w niej występuje w miejscu najstarszego bitu. Posiada on jednak wagę: -2n-1 . Jak można zauważyć system U2 jest lekką modyfikacją systemu U1.
Dla przykładu. Zapisanie wartości -28 w systemie pozycyjnym przebiega w ten sposób:
11100 - Wartość 28
100 -przepisujemy wszystkie jej bity od prawej do momentu napotkania 1 (ją również przepisujemy)
00100 - resztę bitów przepisujemy przeprowadzając ich negację.
100100 - na koniec dodajemy bit znaku, oznajmiający, że wartość jest ujemna.
Trzeba jednak pamiętać, że nie uda nam się w ten sposób zapisać ujemnej liczby o reprezentacji bitowej 1000(...)0. Dlaczego? Po prostu przepisując wszystkie bity do momentu napotkania 1 zapiszemy tą samą liczbę.
Na koniec mała dygresja na temat uświadamiania ludzi z jakim systemem mamy do czynienia. W poprzedniej części wspomniałem o zapisie liczb szesnastkowych i ósemkowych. Tamta reprezentacja, często spotykana jest w programowaniu (co prawda wszystko zależy od języka).
Można też napotkać zapis w takiej formie (101)2 co oznacza ni mniej, ni więcej, że mamy do czynienia z liczbą w systemie dwójkowym. Zapis ten możemy stosować do wszystkich systemów pozycyjnych:
(101110)2 - system dwójkowy
(101110)U1 - system uzupełnień do 1
(FF4)16 - system szesnastkowy
(12394)101 - system o pozycji 101
Prawda, że wygodne?
Trzeba jednak pamiętać, że nie uda nam się w ten sposób zapisać ujemnej liczby o reprezentacji bitowej 1000(...)0. Dlaczego? Po prostu przepisując wszystkie bity do momentu napotkania 1 zapiszemy tą samą liczbę.
Na koniec mała dygresja na temat uświadamiania ludzi z jakim systemem mamy do czynienia. W poprzedniej części wspomniałem o zapisie liczb szesnastkowych i ósemkowych. Tamta reprezentacja, często spotykana jest w programowaniu (co prawda wszystko zależy od języka).
Można też napotkać zapis w takiej formie (101)2 co oznacza ni mniej, ni więcej, że mamy do czynienia z liczbą w systemie dwójkowym. Zapis ten możemy stosować do wszystkich systemów pozycyjnych:
(101110)2 - system dwójkowy
(101110)U1 - system uzupełnień do 1
(FF4)16 - system szesnastkowy
(12394)101 - system o pozycji 101
Prawda, że wygodne?
Brak komentarzy:
Prześlij komentarz
Pamiętaj aby Twoje komentarze były zawsze kulturalne i zgodne z obowiązującą Netykietą. Nie przeklinaj, nie obrażaj i nie wyzywaj innych użytkowników. PS: Nie karm troli.