Zapisywanie liczb całkowitych w różnych systemach liczbowych
Zamiana z systemu dziesiętnego na dowolny
Aby zamienić liczbę o podstawie 10 na dowolną o innej podstawie, należy dzielić ją przez docelową podstawę i zapisywać kolejne reszty z dzielenia. Dzielenia się dokonuje na kolejnych całkowitych wynikach poprzednich dzieleń, aż się dojdzie do wartości 0.
Przykład - zapisać liczbę 100 w systemie o podstawie 6:
100:6=16 |
reszta 4 |
16:6=2 |
reszta 4 |
2:6=0 |
reszta 2 |
Poszczególne cyfry systemu o podstawie 6 otrzymujemy w kolejności od najmniej znaczącej do najbardziej znaczącej. Tutaj 100(10) = 244(6).
Zamiana z systemu dowolnego na dziesiętny
Aby obliczyć dziesiętną wartość liczby o podstawie n, należy obliczyć i zsumować wartości dziesiętne poszczególnych cyfr danej liczby. Wartość cyfry w liczbie o podstawie n jest równa cyfra*npoz, gdzie poz to pozycja cyfry w liczbie liczona od prawej strony od zera.
Przykład - zapisać liczbę 251(7) w postaci dziesiętnej:
251(7) = 2*72+5*71+1*70=2*49+5*7+1*1=98+35+1=134(10)
Zamiana z systemu dziesiętnego na dwójkowy
Jest to szczególny przypadek metody opisanej powyżej, gdzie podstawą jest liczba 2. Dana liczba jest więc dzielona cyklicznie przez 2, a reszty z dzielenia tworzą końcowy wynik.
Przykład - zapisać liczbę 154(10) w systemie binarnym:
154:2=77 |
reszta 0 |
77:2=38 |
reszta 1 |
38:2=19 |
reszta 0 |
19:2=9 |
reszta 1 |
9:2=4 |
reszta 1 |
4:2=2 |
reszta 0 |
2:2=1 |
reszta 0 |
1:2=0 |
reszta 1 |
Poszczególne cyfry systemu binarnego otrzymujemy w kolejności od najmniej znaczącej do najbardziej znaczącej. Tutaj 153(10) = 10011010(2).
Zamiana z systemu dwójkowego na dziesiętny
Analogicznie do metody opisanej powyżej, liczbę dziesiętną otrzymuje się poprzez zsumowanie iloczynów kolejnych cyfr i potęg dwójki, gdzie wykładnikiem potęgi jest nr pozycji cyfry liczony od 0.
Przykład - zapisać liczbę 11010100(2) w postaci dziesiętnej:
11010100(2) = 1*27 + 1*26 + 0*25 + 1*24 + 0*23 + 1*22 + 0*21 + 0*20 = 1*128 + 1*64 + 0*32 + 1*16 + 0*8 + 1*4 + 0*2 + 0*1 = 128 + 64 + 16 + 4 = 212(10)
Zamiana z systemu dwójkowego na szesnastkowy
W przypadku konieczności używania dużych liczb binarnych pojawia się problem łatwego wprowadzenia błędu przez programistę w kodzie źródłowym (spróbujcie wpisać kilka liczb 32-bitowych nie myląc się w tych zerach i jedynkach to szybko zrozumiecie dlaczego tak jest). Dlatego też programiści chętniej używają systemu szesnastkowego do zapisu takich liczb. Ponieważ 4-bitowej liczbie odpowiada jedna cyfra szesnastkowa, zapis liczby w programie zmniejsza się czterokrotnie. A dlaczego nie używa się systemu dziesiętnego? Dlatego, że konwersja z liczby binarnej na szesnastkową jest banalnie prosta. Wystarczy podzielić liczbę na paczki po 4 bity (w razie potrzeby dodać do niej zera na początku jak brakuje do pełnej czwórki bitów) i następnie każdą paczkę bitów zastąpić odpowiadającą jej cyfrą szesnastkową.
Przykład - zamienić liczbę 111101101011110(2) na postać szesnastkową:
Najpierw liczbę dzielimy na paczki po 4 bity, w razie czego na początku dopisujemy zera, żeby można było utworzyć pełne paczki: 0111-1011-0101-1110.
Następnie każdą paczkę zastępujemy odpowiadającą jej cyfrą szesnastkową i otrzymujemy 7-B-5-E. Wynikiem jest więc liczba 7B5E(16).
Zamiana z systemu szesnastkowego na dwójkowy
Tutaj kolejność postępowania jest dokładnie odwrotna niż poprzednio. Aby zamienić liczbę szesnastkową na postać binarną, należy każdą jej cyfrę zastąpić binarnym 4-bitowym odpowiednikiem.
Przykład - zamienić liczbę E4A(16) na postać binarną:
Każdą cyfrę zastępujemy czterema bitami odpowiadającej jej postaci dwójkowej: 1110-0100-1010. Wynikiem jest więc liczba 111001001010(2).
Zapis liczb ujemnych całkowitych w systemie binarnym
Dotychczas przy zapisywaniu liczb binarnych przyjmowano założenie, że są to liczby całkowite nieujemne. Kod binarny takiej liczby określany jest mianem Naturalnego Kodu Binarnego (NKB). Jednak przy pisaniu programów często zachodzi konieczność korzystania z liczb ujemnych. W przypadku systemu dziesiętnego liczbę ujemną oznacza się poprzez dodanie na początku znaku minus. Dla systemu binarnego taka sytuacja jest niemożliwa, gdyż wszelkie dane są zapisane z użyciem kombinacji zer i jedynek. Dlatego też sam zapis liczby ujemnej musi być tak zrobiony, by były użyte jedynie wartości odpowiednich bitów.
W przypadku komputerów do zapisu liczb w systemie dwójkowym używa się powszechnie kodu uzupełnień do dwóch (U2). Kod ten tym się różni od NKB, że wartość najbardziej znaczącego bitu jest ujemna.
Jeżeli najbardziej znaczący bit jest równy 1 to liczba w kodzie U2 jest ujemna, w przeciwnym wypadku jest równa zero lub dodatnia. Tą regułę warto zapamiętać, gdyż pozwala ona na "pierwszy rzut oka" stwierdzić, czy liczba binarna w kodzie U2 jest dodatnia czy też ujemna.
Jak wygląda wartość liczby 4 bitowej w kodzie NKB i U2, prezentuje poniższa tabelka:
wartość dziesiętna |
zapis binarny |
wartość dziesiętna |
0 |
0000 |
0 |
1 |
0001 |
1 |
2 |
0010 |
2 |
3 |
0011 |
3 |
4 |
0100 |
4 |
5 |
0101 |
5 |
6 |
0110 |
6 |
7 |
0111 |
7 |
8 |
1000 |
-8 |
9 |
1001 |
-7 |
10 |
1010 |
-6 |
11 |
1011 |
-5 |
12 |
1100 |
-4 |
13 |
1101 |
-3 |
14 |
1110 |
-2 |
15 |
1111 |
-1 |
Skąd procesor ma wiedzieć, czy dana paczka bitów jest w kodzie NKB czy też U2? Nie musi wiedzieć. Użycie odpowiedniego kodu jest uwzględniane na etapie budowy pliku wykonywalnego (kompilacji kodu źródłowego i łączenia modułów) gdzie informacja o rodzaju kodu jest zawarta w kodzie źródłowym poprzez odpowiednie użycie typów danych przez programistę. Np. w środowisku programowania Delphi "integer" to liczba 32 bitowa w kodzie U2, a "cardinal" to liczba 32 bitowa w kodzie NKB. W zależności od tego jakiego rodzaju typu danych programista użyje, będą wykonywane odpowiednio obliczenia w kodzie U2 lub NKB.
Zamiana liczby dodatniej na ujemną i odwrotnie
Zamiana taka odbywa się wg ściśle określonej dwuetapowej metody. Najpierw w liczbie negowane są wszystkie cyfry, następnie do wyniku negacji dodaje się liczbę 1 (dodawanie w systemie dwójkowym odbywa się na tych samych zasadach co w systemie dziesiętnym). Otrzymany wynik to liczba z przeciwnym znakiem niż liczba startowa.
Przykład. Zamienić liczbę 01110100(U2) na ujemną
Najpierw negujemy wszystkie bity w liczbie, czyli jedynki zastępujemy zerami, a zera jedynkami. Otrzymujemy wtedy: 10001011.
Następnie do wyniku dodajemy liczbę 1 czyli tutaj 00000001.
10001011
+ 00000001
----------
10001100
Wynikiem jest liczba 10001100(U2), czyli 10001100(U2) = - 01110100(U2).
Przejście z liczby ujemnej do dodatniej następuje wg tego samego algorytmu, czyli najpierw negacja bitów a później dodanie do wyniku liczby 1.