Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

4. diel - Typový systém v céčku druhýkrát: Dátové typy

V predchádzajúcom cvičení, Riešené úlohy k 1.-3. lekciu Céčka, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Riešené úlohy k 1.-3. lekciu Céčka , sme si ukázali základné dátové typy, boli to int, float a char. Teraz sa na dátové typy pozrieme viac zblízka a vysvetlíme si, kedy aký použiť. Dnešná tutoriál bude veľa teoretický, ale o to viac bude praktický ten budúci. Na konci si vytvoríme pár jednoduchých ukážok.

Pozn .: Veľkosti a prítomnosť niektorých dátových typov sa môže niekedy rôzniť podľa zvoleného štandardu céčka a cieľovej architektúry počítača.

Celočíselné dátové typy

Pozrime sa teraz na tabuľku vstavaných celočíselných dátových typov v céčka. Všimnite si typu int, ktorý už poznáme z minulej lekcie.

dátový typ rozsah veľkosť
char -128 až 127 8 bitov
short -128 až 127 alebo -32 768 až 32 767 16 alebo 32 bitov
int -32 768 až 32 767 alebo -2 147 483 648 až 2 147 483 647 16 alebo 32 bitov (záleží na systéme)
long int -2 147 483 648 až 2 147 483 647 32 bitov
long long int -9 223 372 036 854 775 808 až 9 223 372 036 854 775 807 64 bitov
Poznámka: U veľkostí dátových typov záleží na operačnom systéme, teda či je 16 bitový alebo 32/64 bitový. Pre vás budú platiť zvyčajne tie vyššie hodnoty.

Možno si teraz hovoríte, že je divné, že char je číslo, keď sme ho uviedli ako znak v predchádzajúcich dieloch. My však môžeme char použiť ako číslo a zároveň ako znak (pri výpise buď použijeme %d ako číslo a alebo %c ako znak). Je to preto, že znaky sú v skutočnosti uložené ako ich číselné kódy, tzv. ASCII hodnoty.

Ďalšia otázka, ktorá vás asi napadá, je: Prečo máme toľko možných typov pre uloženie čísla? Odpoveď je prostá - záleží na jeho veľkosti. Čím väčšie číslo, tým viac spotrebuje pamäte. Pre vek užívateľov teda môžeme zvoliť char, pretože sa asi nedožije viac, než 127 rokov. Predstavte si databázu milióna užívateľov nejakého systému. Keď zvolíme miesto charu int, bude zaberať 4x (alebo 2x) viac miesta. Naopak, keď budeme mať funkciu na výpočet faktoriálu, ťažko nám bude stačiť rozsah typu int a použijeme long int.

Nad výberom dátového typu nemusíte moc premýšľať a väčšinou sa používa jednoducho int. Typ riešte len v prípade, keď sú premenné v nejakom poli (všeobecne kolekciu) a je ich teda viac, potom sa oplatí zaoberať sa pamäťovými nárokmi. Tabuľky sem dávam skôr pre úplnosť.

Desatinné čísla

U desatinných čísel je situácia trochu jednoduchšie, máme na výber iba dva dátové typy. Samozrejme sa opäť líšia v rozsahu hodnôt, ďalej však ešte v presnosti (vlastne počtu des. Miest). Typ double má už podľa názvu dvojnásobnú presnosť oproti float.

dátový typ rozsah presnosť veľkosť
float 1.2E-38 to 3.4E + 38 6 číslic 32 bitov
double 2.3E-308 to 1.7E + 308 15 číslic 64 bitov
long double 3.4E-4932 to 1.1E + 4932 19 číslic 80 bitov
Pozor, vzhľadom k tomu, že desatinné čísla sú v počítači uložené v dvojkovej sústave, dochádza k určitej strate presnosti. Odchýlka je síce takmer zanedbateľná, však keď budete programovať napr. Finančný systém, nepoužívajte tieto dátové typy pre uchovanie peňazí, mohlo by dôjsť k malým odchýlkam. Veľkosť long double sa môže líšiť podľa implementácie.

Keď do float chceme dosadiť priamo v zdrojovom kóde, mali by sme použiť suffix f, u double sufix nepíšeme, akékoľvek desatinné číslo v zdrojovom kóde bez Suffix f je brané ako double:

float f = 10.1f;
double d = 10.02;

Ako desatinný separátor používame v zdrojovom kóde vždy bodku, nehľadiac na to, aké máme v operačnom systéme regionálne nastavenia (napríklad v českom prostredí sa tradične používa desatinná čiarka).

Char

Pozrime sa ešte bližšie na typ char, ktorý môže reprezentovať buď celé číslo alebo znak.

Pre reprezentáciu znaku použijeme char takto:

char z = 'A';
printf("%c", z);

A keď chceme, aby char reprezentoval číslo:

char i = 127;
printf("%d", i);

Usingned typy

Väčšinu dátových typov môžeme ešte predsadiť kľúčovým slovom unsigned, napr. Vytvoríme premennú typu unsigned int a podobne, ale pozor, nefunguje to pre čísla desatinné. Sign označuje znamienko čísla a unsigned znamená, že číslo znamienko nemôže obsahovať. Výsledkom je, že je taká premenná vždy nezáporné a zmestí sa do nej preto aj 2x väčšie číslo, keďže nie je využitá záporná časť. Uveďme si príklad pri type char:

typ rozsah
char -128 až 127
unsigned char 0 až 255
Skúsme si teraz niečo naprogramovať :) Vytvoríme si "tabuľku" s rôznymi dátovými typmi a ich veľkosťami. Založíme si nový projekt s názvom Tabulka a jeho kód upravíme takto:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(int argc, char** argv) {

    return (EXIT_SUCCESS);
}

Pre názornosť som vymazal šedú dokumentáciu, ale pokojne si ju tam nechajte. Zmena spočíva v includování limits.h, čo nám umožňuje prístup k funkciám pre zistenie najvyššie hodnoty dátových typov.

Pre zistenie veľkosti dátového typu použijeme funkciu sizeof(), ktorá nám vráti veľkosť dátového typu v bajtoch.

Pre zistenie rozsahu použijeme konštanty (ty si vysvetlíme neskôr) zo súboru limits.h, ktorý sme si includovali.

Spomínanú funkciu teda vyskúšajme:

int velikostIntu = sizeof(int); // Ukladáme si veľkosť intu.
printf("Int zaberá %d bajt / y / ov miesta \n", velikostIntu); // Vypisujeme veľkosť intu

A toto by mal byť výsledok:

Konzolová aplikácia
Int zaberá 4 bajt / y / ov miesta

Teraz sme vyskúšali, že funkcia sizeof() nám vráti veľkosť zadaného dátového typu. Poďme vyskúšať ešte konštanty zo súboru limits.h, ktoré by nám mali vrátiť najväčšie možné číslo zadaného dátového typu:

int maximalniRozsah = INT_MAX; // Ukladáme maximalní rozsah intu
printf("Maximálny rozsah intu je %d \n", maximalniRozsah); // Vypisujeme maximálny rozsah intu

A toto by mal byť výsledok (ak nemáte iný typ procesora, viď. Vyššie):

Konzolová aplikácia
Maximálny rozsah intu je 2147483647

Keď teraz vieme, že nám konštanty aj funkcie fungujú, môžeme sa vrhnúť do programovania konzolové tabuľky :) Kód bude vyzerať asi tak to:

int maxInt = INT_MAX;
short maxShort = SHRT_MAX;
char maxChar = CHAR_MAX;
char sizeInt = sizeof(int);
char sizeShort = sizeof(short);
char sizeChar = sizeof(char);
printf("INT: zaberá %d bajt / y / ov a najväčšie možné číslo je %d\n", sizeInt, maxInt);
printf("SHORT: zaberá %d bajt / y / ov a najväčšie možné číslo je %d\n", sizeShort, maxShort);
printf("CHAR: zaberá %d bajt / y / ov a najväčšie možné číslo je %d\n", sizeChar, maxChar);

Takto by mal vyzerať výsledok:

Konzolová aplikácia
INT: zaberá 4 bajt / y / ov a najväčšie možné číslo je 2147483647
SHORT: zaberá 2 bajt / y / ov a najväčšie možné číslo je 32767
CHAR: zaberá 1 bajt / y / ov a najväčšie možné číslo je 127

To by sme mali. V budúcej lekcii, Podmienky (vetvenia) v jazyku C , nás čakajú podmienky :)


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 308x (31.75 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C

 

Predchádzajúci článok
Riešené úlohy k 1.-3. lekciu Céčka
Všetky články v sekcii
Základné konštrukcie jazyka C
Preskočiť článok
(neodporúčame)
Podmienky (vetvenia) v jazyku C
Článok pre vás napísal Samuel Kodytek
Avatar
Užívateľské hodnotenie:
3 hlasov
Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
Aktivity