Studijní materiály
EXTRA Přihlásit Kontakt

Modifikátory datových typů v jazyce C

Modifikátory jsou klíčová slova, která se píšou před datový typ a upřesňují, jak velký rozsah hodnot proměnná pojme a co se s ní smí dělat. Díky nim se dá ze stejného základního typu udělat úspornější, nebo naopak větší proměnná:

short a long

Modifikátory short a long mění velikost celočíselného typu. short int má alespoň 16 bitů, long int alespoň 32 bitů a long long int alespoň 64 bitů. Slovo int se přitom může vynechat – long x; a long int x; znamená totéž.

short int maly = 32000;
long int velky = 2000000000L;
long long int hodne_velky = 9000000000LL;

printf("%zu %zu %zu\n", sizeof(short), sizeof(long), sizeof(long long));

signed a unsigned

Modifikátor signed znamená, že typ pojme kladná i záporná čísla (to je výchozí stav), unsigned naopak jen nezáporná. Tím se rozsah posune: znaménkový osmibitový typ zvládne −128 až 127, bezznaménkový 0 až 255. Bezznaménkové proměnné se hodí tam, kde záporná hodnota nedává smysl – třeba počet prvků.

signed char teplota = -15;
unsigned char jas = 250;

unsigned int pocet = 0;
pocet--;    // pozor: nepřeteče do -1, ale na největší možnou hodnotu

Přehled rozsahů

Přesné velikosti nejsou v jazyce C pevně dané, norma určuje jen minimum. Na běžném 64bitovém počítači to obvykle vypadá takto:

char                1 bajt      -128 .. 127
unsigned char       1 bajt         0 .. 255
short               2 bajty     -32 768 .. 32 767
unsigned short      2 bajty           0 .. 65 535
int                 4 bajty     -2 147 483 648 .. 2 147 483 647
unsigned int        4 bajty                  0 .. 4 294 967 295
long                8 bajtů     zhruba -9,2 . 10^18 .. 9,2 . 10^18
long long           8 bajtů     stejně jako long

Konstanty s přesnými hranicemi najdeš v hlavičkovém souboru <limits.h>, například INT_MAX nebo UCHAR_MAX.

#include <stdio.h>
#include <limits.h>

int main(void) {
    printf("int:  %d .. %d\n", INT_MIN, INT_MAX);
    printf("char: %d .. %d\n", CHAR_MIN, CHAR_MAX);
    return 0;
}

const

Kvalifikátor const říká, že se hodnota proměnné po inicializaci nesmí změnit. Překladač pak pokus o změnu odmítne, takže se chyba najde už při překladu, ne až za běhu programu.

const double PI = 3.14159265;

// PI = 3;   // chyba při překladu: assignment of read-only variable

static

Uvnitř funkce znamená static proměnnou, která si mezi voláními pamatuje svou hodnotu a vytvoří se jen jednou. Mimo funkci naopak omezí platnost proměnné nebo funkce na jediný zdrojový soubor.

void pocitadlo(void) {
    static int volani = 0;   // vytvoří se jen při prvním průchodu
    volani++;
    printf("Voláno %d.\n", volani);
}

extern

Slovo extern oznamuje, že proměnná je definovaná v jiném zdrojovém souboru. Sám o sobě nic nevytváří, jen na existující proměnnou odkazuje – používá se hlavně v hlavičkových souborech.

// soubor main.c
int pocet_uzivatelu = 42;

// soubor statistiky.c
extern int pocet_uzivatelu;   // proměnná bydlí jinde

volatile

Kvalifikátor volatile zakazuje překladači optimalizovat přístupy k proměnné, protože její hodnotu může změnit něco mimo program – typicky hardware nebo obsluha přerušení. Mimo programování mikrokontrolérů se používá zřídka.

volatile int stav_tlacitka;