Bity a bajty
V minulej kapitole sme si vysvetlili, ako sú reprezentované čísla z desiatkovej sústavy v dvojkovej sústave. Ako sme videli, potrebujeme na to niekoľko čísiel – jednotiek a núl. Na vyjadrenie čísla 0 a 1 nám stačilo jedno číslo, na vyjadrenie čísla 2 a 3 nám stačili dve čísla atď. To, koľko čísiel na vyjadrenie potrebujeme v podstate značí, koľko čísiel musíme mať v počítači uchovaných, aby sme mohli to dané číslo vyjadriť, čiže potrebujeme na to toľko miest. Je to akokeby toľko tých káblikov, cez ktoré ide alebo nejde elektrika potrebujeme mať obsadených pre to dané číslo.
To miestečko pre jedno číslo (káblik určujúci true/false alebo 0/1) je v podstate najmenšie možné úložisko nejakej informácie. Informácia v tomto prípade predstavuje údaj či je to 0 alebo 1. Jednotka pre informáciu dostala názov bit (bit - kúsok, trochu alebo binary digit – binárna číslica) a jej značka je malé písmeno b. Najmenšia možná (základná) jednotka informácie je teda jeden bit = 1b. Do jedného bitu vieme uchovať jednu z dvoch logických hodnôt: 0 alebo 1. To, koľko rôznych hodnôt do neho môžeme uložiť získame umocnením práve čísla 2 (pretože dve hodnoty tam môžu byť) na počet bitov. Čiže v jednom bite môže byť dva na prvú hodnôt, čiže 2. V dvoch bitoch môžu byť dva na druhú rôznych hodnôt, čiže 4. V troch bitoch vieme uložiť dva na tretiu čiže 8 rôznych hodnôt atď.
Táto jednotka (bit) je dosť malá a tak vznikla nová a kus väčšia a to je jeden bajt (byte – slabika), ktorá sa označuje veľkým písmenom B. Jeden bajt obsahuje 8 bitov, čiže vie uchovať 256 rôznych hodnôt (dva na ôsmu), čiže čísla od 0 – 255 (1B = 8b). Ešte väčšie jednotky vznikajú štandardnými predponami ako sme zvyknutí inde – čiže kilo (1k = 10 na tretiu = 1000), mega (1M = 10 na šiestu = 1 000 000), giga (1G = 10 na deviatu = 1 000 000 000) atď.
Okolo počítačov sa však v minulosti tieto predpony zvkykli chápať inak a to tak, že kilo nebolo 10 na tretiu (1000), ale 2 na desiatu (1024). Z toho vychádzali aj ostatné označenia, kde mega bolo 1024x1024 a podobne. Aby v tom nebol zmätok, štandardné predpony kilo, mega, gigia (10 na 3,10 na 6,10 na 9) ostávajú ako sú a v súvislosti s IT vznikli tzv. binárne predpony, ktoré majú označenie kibi (kilo binary – Ki), mebi (mega binary – Mi) a gibi (giga binary – Gi). Čiže ak sa niekedy stretnete s tým, že jeden megabajt (1MB) je 1024 kilobajtov (KB), tak by to malo byť po správnosti MiB...
A práve tieto čísla – mocniny dvojky sú veľmi populárne v praxi. Napríklad rýchlosť internetu sa štandardne udáva v kilobitoch za sekundu (kbps) alebo rýchlosť prenosu dát pri USB zariadeniach. Alebo ak ste niekedy kupovali počítač alebo ste sa zaujímali, aké má parametre, možno ste sa čudovali, prečo nemá pamäť 500, 1000 alebo 250 MB (okrúhle čísla), ale práve 512, 1024 alebo 256. Práve preto, všetko to súvisí s mocninami dvojky a teda koľok bitov a bajtov sa kde zmestí.
A aký to má význam pre programátora? Význam to má najmä pri pracovaní s dátovými typmi, resp. s premennými. Keď sme si ukladali čísla do premennej a takisto pri databáze, keď sme určovali dátové typy, tak sme si vraveli niečo o tom, že do typu int (integer) môžeme vložiť veľké číslo, ale nie úplne také veľké a viac sme sa tomu nevenovali (bolo to v tom čase zbytočné). A práve toto, aké veľké číslo a koľko toho môžeme uložiť do jednotlivých typov (aj textových) má súvis s bitmi a bajtami (a teda mocninami dvojky).
Napríklad v jazyku MySQL je viacero typov pre ukladanie čísiel. Napríklad zadefinovaním typu stĺpca na TINYINT (tiny – malý integer) hovoríme, že chceme rezervovať pre tento typ v pamäti jeden bajt. Ako vieme, jeden bajt je 8 bitov a teda to je 2 na ôsmu čísiel, čo je 256 čísiel, takže do tohto stĺca môžeme uložiť iba čísla od 0 do 255. Takto veľmi pekne vieme zistiť aj rozsahy pre ostatné typy:
TINYINT – 1 bajt – 2 na 8 – 256 – čísla od 0 po 255
SMALLINT – 2 bajty – 2 na 16 – 65 536 – čísla od 0 po 65 535
MEDIUMINT – 3 bajty – 2 na 24 – 16 777 216 – čísla od 0 po 16 777 215
INT – 4 bajty – 2 na 32 – 4 294 967 296 – čísla od 0 po 4 294 967 295
BIGINT – 8 bajtov – 2 na 64 – 18 446 744 073 709 551 616 – čísla od 0 po 18 446 744 073 709 551 615
Až teraz vidíte súvislosť s tým, keď sme si vraveli, že netreba nám zbytočne zadávať veľké číselné typy pre stĺpce. Ak napríklad vieme, že nikto nemá viac ako 255 rokov, stačí nám na to tinyint alebo ak vieme, že nebudeme mať viac ako 4 miliardy používateľov/fotiek alebo niečo iného, stačí nám pre id typ int a podobne. Takto sa dá šetriť pamäť, resp. ňou nemusíme zbytočne plytvať.
Každý typ premennej či už v MySQL alebo PHP má predom danú veľkosť v bajtoch v pamäti. Akonáhle vytvárame v kóde premennú, znamená to, ako sme si už povedali, že na danom mieste v pamäti vyhradíme pre ňu miesto a pristupujeme k nemu pomocou unikátneho mena v kóde. Podľa toho, akého je typu a teda koľko miesta v pamäti je pre ňu rezervovaného, podľa toho môžeme do nej vkladať hodnotu. Samozrejme, ak by sme sa pokúsili vložiť väčšiu hodnotu, ako je možné podľa aktuálneho typu, či už v PHP alebo v MySQL, program by nám hodil chybu a hodnota by sa tam neuložila.
Nejako podobne to funguje aj s ukladaním stringových typov, či už v databáze alebo v PHP. S ukladaním ostatných znakov ako čísiel je to troška komplikovaniejšie, takže sa tým nejdeme zbytočne zaoberať. Systém je ale rovnaký, tiež sú v pamúti vyhradené isté veľkosti bajtov pre rôzne typy a vzhľadom k tomu je aj obmedzený vo väčšine počet znakov.
Čo sa týka napríklad typu integer v jazyku PHP, tam to závisí aj od toho, na akej mašine, resp. na akom serveri to beží. V súčanosti existujú aj 32 bitové procesory, ktoré tu boli odjakživa a aj 64 bitové, ktoré sú tu najmä posledné roky. Podľa toho sa totižto mení aj obmedzenie pre rozsah tohto typu. Totižto na štandardnom prostredí (32 bitovom) mal integer klasicky 2 na 32 (4 bajty), čiže čísla od – 2 147 483 648 do + 2 147 483 647 (ak berieme znamienkové čísla – aj záporné aj kladné). Na 64 bitovom procesore je totižto maximum 2 na 64, čiže oooveľa väčšie číslo.
Na záver jedna pikoška, okolo tohto mal v roku 2014 problém aj sám veľký Google, pretože slávna to pesnička Gangnam Style presiahla počet videní, ktoré bolo v Google Databázach určené na typ integer, takže 2 na 31 mínus 1 (na 31 a nie 32 preto, lebo dva razy menšie kvôli tomu, že to ide od záporných po kladné a nie od nuly len po kladné) = 2 147 483 647. Kvôli tomu museli zmeniť tento typ na 64 bitový, aby sa to tam zmestilo. Neskôr ale Google priznal, že to bol z ich strany iba vtip ;-)
Možno ste sa zamysleli, a čo keď chcem uložiť číslo väčšie ako 2 miliardy, to až tak veľa zase nie je. Automaticky pri priradení v PHP sa stane z tejto premennej typ float (číslo s plávajúcou rádovou čiarkou – ľudovo desatinné číslo). Tento typ slúži najmú na ukladanie desatinných čísiel, pretože integer môže obsahovať len celé čísla a jednak to slúži ako to maximálne možné rozpätie pre uloženie premennej. Tento typ premennej sa zvykne označovať aj ako real (reálne čísla).