Lekce 4 - Typový systém podruhé - Datové typy v C++
V předešlém cvičení, Řešené úlohy k 1.-3. lekci C++, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Nyní se na datové typy podíváme více zblízka a vysvětlíme si, kdy jaký použít. Dnešní C++ tutoriál bude hodně teoretický, ale o to více bude praktický ten příští. Na konci si vytvoříme pár jednoduchých ukázek.
C++ rozeznává mnoho různých datových typů. Těm základním se říká fundamentální a jedná se zejména o čísla.
Celočíselné datové typy
Podívejme se nyní na tabulku všech vestavěných celočíselných
datových typů v C++, všimněte si typu int
, který již známe z
minula.
Datový typ | Rozsah | Velikost |
---|---|---|
signed char | -128 až 127 | 8 bitů |
unsigned char | 0 až 255 | 8 bitů |
short | –32 768 až 32 767 | 16 bitů |
unsigned short | 0 až 65 535 | 16 bitů |
int | –2 147 483 648 až 2 147 483 647 | 32 bitů |
unsigned int | 0 až 4 294 967 295 | 32 bitů |
long int | velikost i rozsah jsou závislé na překladači | |
unsigned long int | velikost i rozsah jsou závislé na překladači | |
long long int | velikost i rozsah jsou závislé na překladači | |
unsigned long long int | velikost i rozsah jsou závislé na překladači |
Pozn.: rozsahy a velikosti typů jsou závislé na překladači a architektuře systému, já tu uvádím hodnoty pro Visual Studio a 64 bitovou architekturu.
Asi vás napadá otázka, proč máme tolik možných typů pro uložení
čísla. Odpověď je prostá, záleží na jeho velikosti. Čím větší
číslo, tím více spotřebuje paměti. Pro věk uživatele tedy zvolíme
unsigned char
, protože se jistě nedožije více, než
255
let. Představte si databázi milionu uživatelů nějakého
systému, když zvolíme místo unsigned char
, int
,
bude zabírat 4x více místa. Naopak když budeme mít funkci k výpočtu
faktoriálu, stěží nám bude stačit rozsah int
u a použijeme
long long
.
Všimněte si, že některé typy začínají na unsigned
. Jsou
téměř stejné, jako jejich dvojníci bez unsigned
, jen
neumožňují záporné hodnoty a tím pádem na kladnou část mohou uložit 2x
vyšší hodnotu. Opakem je signed
, který ale překladač
doplňuje automaticky (výjimkou je signed char
, protože samotné
char
má jiný význam).
Nad výběrem datového typu nemusíte moc přemýšlet a většinou se
používá jednoduše int
. Typ řešte pouze v případě, když
jsou proměnné v nějakém poli (obecně kolekci) a je jich tedy více. Potom
se teprve vyplatí zabývat se paměťovými nároky. Tabulku sem dávám
spíše pro úplnost. Mezi typy samozřejmě funguje již zmíněná implicitní
konverze, tedy můžeme přímo přiřadit int
do proměnné typu
long
a podobně, aniž bychom něco konvertovali.
Desetinná čísla
U desetinných čísel je situace poněkud jednodušší, máme na výběr
pouze tři datové typy. Samozřejmě se liší opět v rozsahu hodnoty, dále
však ještě v přesnosti (vlastně počtu des. míst). Typ double
má již dle názvu dvojnásobnou přesnost oproti float
.
Datový typ | Rozsah | Přesnost |
---|---|---|
float | +-3.4 * 10−38 až +-3.4 * 1038 | 7 číslic |
double | +-1.7 * 10−308 až +-1.7 * 10308 | 15 číslic |
long double | +-1.7 * 10−308 až +-1.7 * 10308 | 15 číslic |
Pozn: typ long double
je někde stejný jako
double
, nebo může být větší, ve VS je stejný.
Pozor, vzhledem k tomu, že desetinná čísla jsou v počítači uložena ve dvojkové soustavě, dochází k určité ztrátě přesnosti. Odchylka je sice téměř zanedbatelná, nicméně když budete programovat např. finanční systém, mohou se objevit problémy.
Jako desetinný separátor používáme ve zdrojovém kódu vždy
tečku, nehledě na to, jaké máme ve Windows regionální nastavení.
Pokud kdekoli ve zdrojovém kódu přímo zadáme desetinné číslo, bere se
jako double
. Hodnoty float
je nutné zadávat se
suffixem f
:
double d = 3.14; float f = 3.14f;
Další vestavěné datové typy
Podívejme se na další datové typy, které nám C++ nabízí:
Datový typ | Rozsah | Velikost/Přesnost | Význam |
---|---|---|---|
char | U+00 až U+ff (0 až 255 nebo -128 až 127) | 8 bitů | znak |
wchar_t | U+0000 až U+ffff (0 až 65 535) | 16 bitů | "široký" znak |
bool | true nebo false (1 nebo 0) | 8 bitů | logická hodnota |
char
Typ char
(character) nám reprezentuje jeden znak. Na rozdíl od
typu string
, který reprezentoval celý řetězec hodnot typu
char
, píšeme znaky v C++ do jednoduchých apostrofů:
char c = 'A';
Typ char
patří v podstatě do celočíselných proměnných
(obsahuje číselný kód znaku), ale přišlo mi logičtější uvést ho
zde.
wchar_t
je podobný, jen umožňuje uložit znak z více
znakových sad, např. může obsahovat znak diakritický.
bool
Typ bool
nabývá dvou hodnot: true
(pravda) a
false
(nepravda). Budeme ho používat zejména tehdy, až se
dostaneme k podmínkám. Do proměnné typu bool
lze uložit jak
přímo hodnotu true
/false
, tak i výsledek logického
výrazu nebo celé číslo (0
jako false
a cokoli
jiného jako true
).
Zkusme si jednoduchý příklad:
{CPP_CONSOLE}
bool b = false;
bool vyraz = (15 > 5);
cout << b << endl;
cout << vyraz << endl;
cin.get();
{/CPP_CONSOLE}
Výstup programu:
Konzolová aplikace
0
1
Výrazy píšeme do závorek. Vidíme, že výraz nabývá hodnoty
true
(pravda), protože 15
je opravdu větší než
5
. Od výrazů je to již jen krok k podmínkám.
Je toho ještě spoustu k vysvětlování a existují ještě další datové typy.
Aby jsme však stále neprobírali jen teorii, ukážeme si v příští lekci, Podmínky (větvení) v C++, slíbené podmínky a vytvoříme další, zajímavější aplikace