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 |
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é 309x (31.75 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C