Do dalszej nauki niezbędna będzie nam wiedza o systemach liczbowych. Jest to bardzo potrzebne, ponieważ w programowaniu nie stosuje się tylko zwykłego, codziennego systemu dziesiętnego. No właśnie. Zatrzymajmy się przy nim na chwilę. Dlaczego nazywa się on dziesiętny? To chyba oczywiste, ponieważ ma w podstawie 10 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. A jeśli jakiś inny system miałby tylko dwie liczby w podstawie: 0 oraz 1? Wtedy poszczególne liczby miałyby postać:
podstawa: 10-cyfr - 2-cyfry
0 - 0
1 - 1
2 - 10
3 - 11
4 - 100
5 - 101
6 - 110
7 - 111
8 - 1000
9 - 1001
10 - 1010
11 - 1011
itd...
Ponieważ system ten ma w podstawie właśnie dwie cyfry, nazywa się
dwójkowym(binarnym). System, który ma w postawie osiem cyfr nazywa się
ósemkowym, a mający np. sześć -
szóstkowym itp. Komputer posługuje się systemem dwójkowym (tak mu najłatwiej:), coś jest lub nie ma, płynie prąd lub nie płynie, zero albo jeden. Cała pamięć komputera składa się z jednostek, które mogą przyjmować wartość zero lub jeden (taka jednostka to
bit). Osiem takich jednostek tworzy
bajt, który może przyjmować już wartości 0-255. Dlaczego? 11111111 dwójkowo = 255 dziesiętnie. Aby uprościć podobne zapisy, liczbę zapisaną w określonym systemie oznaczamy pierwszą literą nazwy systemu w jakim ta liczba jest zapisana, np.: 101b (
binarnie), 36o (ósemkowo,
oct) itd. Systemu dziesiętnego nie oznaczamy. Wracając do bajtu, możemy teraz zapisać: 11111111b = 255. Żeby to udowodnić, nauczymy się przeliczać dowolny system na dziesiętny. Jest to całkiem proste. Rozpiszmy najpierw liczbę 255 (dziesiętnie):
255= 2*10^2 + 5*10^1 + 5*10^0
Znaczek: ^ oznacza potęgowanie. Chyba nie ma wątpliwości, że zapis jest prawdziwy? Łatwo można zauważyć pewną prawidłowość: bierzemy kolejno od prawej poszczegolne cyfry, mnożymy je przez podstawę podniesioną do kolejnej potęgi (liczonej od zera) i dodajemy do siebie. Gdybyśmy więc rozpisali w podobny sposób jakąś liczbę w innym systemie:
10011b =
= 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 1*2^0 =
= 16 + 0 + 0 + 2 + 1 =
= 19
Teraz już samemu możesz przeliczyć 11111111b i sprawdzić. Schemat ten sprawdza się dla każdego systemu, o dowolnej podstawie, przy przeliczaniu na wartość dziesiętną. Jeśli byś chciał zrobić odwrotnie i zamienić np. 24 na system dwójkowy, to już jest nieco trudniej (można posłużyć się kalkulatorem, choćby tym z Windowsa). W tym przypadku daną liczbę musisz dzielić przez podstawę systemu na jaki chcesz ją zamienić i brać pod uwagę reszty z dzielenia. Spójrz na przykład:
24 | 0 {24/2=12, nie ma reszty z dzielenia}
12 | 0 {12/2=6, jw.}
6 | 0
3 | 1 {3/2=1, reszta=1}
1 | 1 {1/2=0, reszta=1}
0
Dzielimy tak długo, dopóki nie otrzymamy zera. Po prawej stronie mamy zapisane reszty z poszczególnych dzieleń. Czytając te reszty od dołu mamy wynik! Czyli 24 = 11000b!
Systemów, jak już mówiłem, jest bardzo dużo. Są również takie, które mają w podstawie więcej niż dziesięć cyfr. Przykładem jest bardzo dla Ciebie ważny system szesnastkowy (
hexadecimal). Ale jak to? Przecież cyfr jest tylko dziesięć, a tutaj mam używać szesnastu? Żaden problem! Po prostu jako kolejnych cyfr użyjemy liter:
dec - hex
1 - 1
2 - 2
... - ...
9 - 9
10 - A
11 - B
12 - C
13 - D
14 - E
15 - F
16 - 10
17 - 11
... - ...
25 - 19
26 - 1A
27 - 1B
... - ...
255 - FF
Warto teraz rozszerzyć naszą wiedzę o bajcie: 1bajt = 11111111b = FFh = 255. Pracując na jednostkach pamięci częściej stosuje się system szesnastkowy niż dziesiętny ponieważ jest wygodniejszy. FFFFh wydaje się mniej skomplikowane niż 65535, prawda? Jeszcze jedno. Pascal rozróżnia system dziesiętny od szesnastkowego, dlatego jeśli chcesz jakąś liczbę zapisać w tym drugim, postaw przed nią $ (np. a:=$FF).
I proszę. Kolejną dosyć ciężką część materiału mamy za sobą. Jeśli czegoś nie rozumiesz, to przeczytaj jeszcze raz. To naprawdę ważne. A jako zadanie domowe napisz kalkulator przeliczający dowolny system na dziesiętny.