Číselné datové typy podrobněji
C++ 11

image_printTisk

V této úvodní kapitole základů C++ jsme se zmínili pouze o dvou číselných datových typech, a to int double. Spektrum číselných datových typů, a to jak pro celá čísla, tak i pro desetinná, je v jazyce C++ mnohem širší. V tomto článku se podíváme na tuto problematiku C++ mnohem podrobněji.

Celočíselné datové typy

Odborně bychom mohli říci, že existují následující modifikátory typu int, které mění číselný rozsah zmíněného datového typu a určují, zda je znaménkový anebo ne. Jsou to:

  • short
  • long
  • signed
  • unsigned

Začneme popisem modifikátorů short long. Z jejich anglického názvu je patrné, že short zkracuje číselný rozsah intlong jej naopak prodlužuje. V C++ aplikací těchto modifikátorů vznikají následující nové datové typy:

  • short int
  • int
  • long int
  • long long int

V podstatě modifikovaný datový typ vytvoříme tak, že uvedeme příslušný modifikátor před klíčové slovo int.

Nyní se zaměříme na signedunsigned. Modifikátor signed definuje, že příslušný datový typ může pracovat se zápornými čísly a naopak modifikátor unsigned použití záporných čísel zakazuje. Zákazem použití záporných čísel se mění význam aplikace některých bitových operátorů a navíc se rozšíří i číselný rozsah příslušného neznaménkového datového typu. V kombinaci s modifikátory short long se nám rozšiřuje opět množina datových typů na:

  • signed short int
  • unsigned short it
  • signed int
  • unsigned int
  • signed long int
  • unsigned long int
  • signed long long int
  • unsigned long long int

Je důležité zmínit, že pokud není před datovým typem uvedeno klíčové slov signed, ani unsigned, je datový typ automaticky považovaný za znaménkový, tedy může pracovat se zápornými čísly.

Nyní je na místě zmínit, že ISO norma standardu C++ nedefinuje číselný rozsah příslušných datových typů, jen určuje jejich relativní uspořádání dle velikosti. Konkrétní číselný rozsah vyjádřený počtem bitů závisí na konkrétní implementaci překladače a platformě. Relativní rozsah dle ISO je definován následovně:

char <= short int <= int <= long int <= long long int

Pokud v programu potřebujeme garanci, že určitý datový typ má velikost 32 bitů nebo 64 bitů, je na to jednoduché řešení. Existuje hlavičkový soubor <cstdint> standardní knihovny C, který definuje například následující datové typy:

  • int8_t
  • int16_t
  • int32_t
  • int64_t
  • uint8_t
  • uint16_t
  • uint32_t
  • uint64_t

Význam by měl být přímočarý. Číselný údaj reprezentuje počet bitů příslušného datového typu a písmeno u před datovým typem určuje, že jde o bezznaménkový datový typ.

Nakonec se ještě zmíníme o jednoduchých “zkratkách” pro definici datových typů. Věc spočívá v tom, že můžeme vynechat v definici klíčové slovo int:

  • unsigned – znamená unsigned int
  • long – znamená long int
  • long long – znamená long long int
  • atd.

Desetinná čísla

Zatím jsme se seznámili s datovým typem double pro desetinná čísla. Celkově ale existují pro ně následující tři datové typy:

  • float – pro jednoduchou přesnost
  • double – pro dvounásobnou přesnost
  • long double – pro rozšířenou přesnost

Opět i u datových typů pro desetinná čísla platí, že ISO C++ norma nedefinuje jejich rozsah, ale jen následující relativní číselný rozsah:

float <= double <= long double

Pro volbu správné přesnosti pro výpočty je nutná důkladná znalost metod výpočtů s desetinnými čísly na příslušné platformě. Bližší informace o definovaných přesnostech desetinných čísel lze nalézt na Wikipedii o normě IEEE 754 .

Pokud nepotřebujete provádět nějaké vědecké výpočty, je vhodné vybrat si pro ně datový typ double nebo long double.

Zápis čísel pro různé datové typy

Nyní se seznámíme s různými variantami zápisu čísel v C++. První se podíváme, jak zapisovat čísla v různých číselných soustavách. Na výběr máme číselnou soustavu desítkovou, šestnáctkovou a osmičkovou. Jak zapsat čísla v těchto soustavách ukazuje následující výčet:

  • 100 – je číslo v desítkové soustavě
  • 0xFFFF – je číslo v šestnáctkové soustavě
  • 077 – je číslo v osmičkové soustavě

Pokud je číslo uvozeno nulou a znakem  nebo X, je to vždy číslo pro šestnáctkovou soustavu. Pokud je uvozeno nulou a za ním následují čísla v intervalu <0, 7>, překladač jej vyhodnotí jako číslo v soustavě osmičkové, v jiném případě jde o číslo v soustavě desítkové.

Od ISO normy jazyka C++ schválené v roce 2014 můžeme zadávat i čísla v soustavě binární. Zápis je jednoduchý, je třeba před takto vyjádřené číslo uvést číslo 0 a písmeno b. Například 0b11101110.

Při zápisu čísel probíhá také odvozování datového typu pro číslo zapsané ve zdrojovém kódu. Platí pravidlo, že překladač zvolí první datový typ, do kterého se číslo “vleze”. Pokud potřebujeme například pro číslo 1, aby bylo datového typu unsigned long long, musíme si to po překladači vyžádat připojením speciální přípony za toto číslo. Přípony, které lze použít, jsou následující:

  • 1U – číslo bude nejméně datového typu unsigned int
  • 1L – číslo bude datového typu nejméně long int
  • 1LL – číslo bude datového typu long long int
  • 1UL – číslo bude datového typu nejméně unsigned long int
  • 1ULL – číslo bude datového typu unsigned long long int

Při zápisu čísel desetinných se používá desetinná tečka místo desetinné čárky, jak jsme zvyklý z matematiky. Dále se může připojit i exponent (se znaménkem nebo bez) tak, že za číslo uvedeme písmeno nebo a po té exponent zapíšeme. Uveďme následující příklady:

  • 123.
  • 0.3324
  • 3.14
  • .124
  • 23e-10
  • 9.145E56

Všechny zmíněné ukázky jsou korektní zápisy desetinného čísla. Je důležité si uvědomit, že pokud neuvedeme desetinnou tečku, je číslo automaticky považováno překladačem za celé.

Výchozím datovým typem pro desetinné číslo  je datový typ double. Pokud chceme, aby byl použit datový typ float je nutné uvést za číslo písmeno f nebo a pokud má být použit datový typ long double, tak písmeno nebo L. Viz následující příklady:

  • 1.26656 – datový typ double
  • 5.7785f – datový typ float
  • 5.7888L – datový typ long double

“Storage classes”

Součástí deklarace proměnných může být i tzv. “storage class”. Je to klíčové slovo, které definuje životnost dané proměnné a způsob linkování v programu.

Napřed uvedu jedno upozornění pro čtenáře, kteří se zabývají jazykem C++ delší dobu. Kdysi existovali “storage classes” autoregister. Význam klíčového slova auto byl změněn normou jazyka C++ 2011 a klíčové slovo register se považuje normou C++ 2017 za zastaralé, ne-li již zrušené. V současné době bychom měli používat pouze následující “storage classes”:

  • static – takto deklarovaná proměnná uvnitř funkce “přežívá” její ukončení a uchovává si původní hodnotu při jejím dalším vyvolání
  • extern – používá se jako odkaz na globální proměnnou, kterou chceme použít v jiném modulu, jinak řečeno CPP souboru
  • thread_local – takto deklarovaná globální proměnná se stává “lokální” proměnnou pro každé vlákno, čili není sdílená mezi vlákny aplikace
  • mutable – má význam u tříd, umožňuje deklaraci proměnné, která může být modifikována i u konstantních objektů a blíže se s jejím použitím seznámíme v druhé kapitole o objektově orientovaném programování

 

image_printTisk
Číselné datové typy podrobněji
C++ 11
Ohodnoťte tento článek

Související články

  • Operátory podrobněji V předchozích článcích jsme se seznámili již s několika typy základních operátorů v C++. Tato kapitola slouží k představení zbytku operátorů, které se v jazyce C++ […]
  • Datový typ “bool” Cílem tohoto článku je osvětlit význam datového typu bool pro logickou hodnotu. Budete seznámeni s novými klíčovými slovy, vysvětlíme si rozdíl mezi operátorem porovnání a přiřazení a v […]
  • Aritmetické operátory Tento článek by měl čtenáři nastínit používání základních aritmetických operátorů v jazyce C++. Je dobré upozornit, že C++ disponuje širší sadou operátorů, než se třeba pojednává ve […]
  • Generování náhodných čísel http://en.cppreference.com/w/cpp/numeric/random  
  • Matematické funkce hlavičky: cmath cstdlib cinttypes   abs, labs, llabs div, ldiv, lldiv abs, imaxabs div, imaxdiv abs, fabs fmod remainder remquo fmax, fmin […]
  • Datová struktura “stack” Datová struktura zásobník funguje na principu zvaném LIFO (Last In First Out). To znamená, že položka, která do něj byla vložena poslední,  je jako první vyjmuta. V podstatě můžeme říci, […]