Systemy zapisu liczb w C++
Istnieje dużo systemów zapisu liczb. Chodzi tu o to ile liczb możemy zapisać na jednej pozycji. Nas będą interesować 4 które są wykorzystywane w C++.
System binarny
Jest to podstawowy system, na którym jest oparta cała informatyka. Cechuje się tym że składa się z bitów. Bit jest to najmniejsza komórka która przechowuje informację. może przyjmować wartości tylko 1 albo 0.
Z ośmiu bitów składa się bajt. Macie pewnie pytanie w jaki sposób komputer poznaje wartość liczby, skoro są tam same zera i jedynki np (01001011)??
Każdy bit jest odpowiedzialny za jakąś konkretną wartość. Przyjrzyj się tabeli:
2n | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
2n= | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
n= | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Jak widzisz wszystko opiera się na potęgach dwójki. Tylko teraz trzeba to wytłumaczyć. Dla tego na potęgach dwójki że bit może przyjmować tylko 2 wartości (1 i 0). Natomiast n bitów tworzy 2n różnych od siebie kombinacji. Łatwo teraz policzyć ile będzie miała kombinacji liczba 8bitowa, czyli 1 bajtowa.
28=256
Często biorą się niuanse w zależności czy liczymy od zera czy od jedynki.
Nie wytłumaczyłem jeszcze w jaki sposób przelicza się liczby binarne na dziesiętne
Istnieje coś takiego jak bity o mniejszym i większym znaczeniu. Bity o najmniejszym znaczeniu znajdują się po prawej stronie a o największym znaczeniu po lewej.
Wartość liczby jest to suma potęg dwójki za które są odpowiedzialne poszczególne bity. Bit 0 jest odpowiedzialny za 1, bit 4 za 16. Zacznijmy tak: Nasza suma na początku ma wartość 0. Idziemy od prawej do lewej. Jeżeli bit 0 ma wartość 1 dodajemy do sumy 20 czyli 1, jeżeli wartość bitu drugiego jest 1 dodajemy do sumy 21 czyli 2, i tak n razy.
Proponuję poprzeliczać sobie troszeczkę na kartce a potem sprawdzić z kalkulatorem, np w wIndows (widok kalkulatora profesjonalny).
Język C++ niestety nie posiada obsługi zapisu liczb binarnych. Trzeba je najpierw przeliczyć na jeden z poniższych.
Istnieje jeszcze takie pojęcie jak starsze i młodsze bity w bajcie. Przez starsze rozumiemy 4 bardziej znaczące bity (te od lewej), a przez młodsze 4 mniej znaczące bity (te od prawej).
System ósemkowy
Jest to najmniej chyba stosowany system. Aczkolwiek łatwo go pojąć.
Pojedyncze miejsce może przybierać wartości od 0 - 7, czyli tyle co mają 3 bity. Jeżeli przyjmie większą wartość to dodaje się z przodu jedynkę. Jest to tak jak z liczbami dziesiętnymi, tylko liczy się do siedmiu.
W C++ zapisuje się taką liczbę zawsze z zerem na początku. Np. 07564132
System dzisiętny
Jeżeli ktoś chodził do podstawówki, to w 1 klasie uczyli go systemu dziesiętnego. Jego zapis w C++ jest że tak powiem normalny. Jeżeli nie występuje żaden wyróżnik na początku, to komopilator traktuje liczbę jako liczbę dziesiętną
System szesnastkowy
Jest to najbardziej rozpowszechniony system w informatyce. Pojedyńczy znak przybiera wartości od 0-15, czyli tyle co 4 bity. Bardzo ładnie odwzorowywuje starsze i młodsze bity w bajcie.
Powstaje pewnie pytanie jak na jednym miejscu cyframi zapisać wartości od 0 do 15. od 0 do 9 pisze się cyframi, a od 10 - 15 kolejnymi literami alfabetu A-F
Zapis w C++ takiej liczby musi być poprzedzony zerem i x. Np liczba 1 bajtowa ma postać: 0x3F. Wielkość litery x i liter oznaczających wartość A-F nie ma znaczenia. Będę używał różnego zapisu.
Binarnie | Ósemkowo | Dziesiętnie | Szesnastkowo |
---|---|---|---|
0000 | 00 | 0 | 0x00 |
0001 | 01 | 1 | 0x01 |
0010 | 02 | 2 | 0x02 |
0011 | 03 | 3 | 0x03 |
0100 | 04 | 4 | 0x04 |
0101 | 05 | 5 | 0x05 |
0110 | 06 | 6 | 0x06 |
0111 | 07 | 7 | 0x07 |
1000 | 010 | 8 | 0x08 |
1001 | 011 | 9 | 0x09 |
1010 | 012 | 10 | 0x0A |
1011 | 013 | 11 | 0x0B |
1100 | 014 | 12 | 0x0C |
1101 | 015 | 13 | 0x0D |
1110 | 016 | 14 | 0x0E |
1111 | 017 | 15 | 0x0F |
10000 | 020 | 16 | 0x10 |
... | ... | ... | ... |