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 |
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 |
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:
{C_CONSOLE}
char z = 'A';
printf("%c", z);
{/C_CONSOLE}
A keď chceme, aby char reprezentoval číslo:
{C_CONSOLE}
char i = 127;
printf("%d", i);
{/C_CONSOLE}
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 |
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:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char** argv) {
int velikostIntu = sizeof(int); // Ukladáme si veľkosť intu.
printf("Int zaberá %d bajt / y / ov miesta \n", velikostIntu); // Vypisujeme veľkosť intu
return (EXIT_SUCCESS);
}
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:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char** argv) {
int maximalniRozsah = INT_MAX; // Ukladáme maximalní rozsah intu
printf("Maximálny rozsah intu je %d \n", maximalniRozsah); // Vypisujeme maximálny rozsah intu
return (EXIT_SUCCESS);
}
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:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char** argv) {
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);
return (EXIT_SUCCESS);
}
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é 311x (31.75 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C
