A C programozási nyelvben az adattípusok alkotják az adatelemek tárolásának szemantikáját és jellemzőit. A nyelvi szintaxisban memóriahelyek vagy változók deklarációi formájában fejezik ki őket. Az adattípusok határozzák meg a műveletek típusait vagy az adatelemek feldolgozásának módszereit is.

A C nyelv alapvető aritmetikai típusokat biztosít, például egész és valós szám típusokat, valamint szintaxist tömb- és összetett típusok létrehozásához. A C szabványos könyvtár fejlécei, amelyeket include direktívákon keresztül kell használni, a támogatott típusok definícióit tartalmazzák, amelyek további tulajdonságokkal rendelkeznek, például pontos méretű tárhelyet biztosítanak, függetlenül az adott hardverplatformon alkalmazott nyelvi implementációtól.

Elsődleges típusok Fő típusok A C nyelv négy alapvető aritmetikai típusleírót biztosít: char, int, float és double (valamint a boolean típust: bool), továbbá módosítókat: signed, unsigned, short és long. Az alábbi táblázat felsorolja a megengedett kombinációkat nagyszámú, méretspecifikus deklaráció megadásakor.

Típus Magyarázat Méret (bit) Formátumleíró Tartomány Decimális konstansok utótagja Logikai típus, a C23-ban hozzáadva. (Korábban a _Bool típust a C99-ben adták hozzá, de a mérete és a tartománya nem volt megadva.) 1 (exact) %d [, ] A gép legkisebb címezhető egysége, amely alap karakterkészletet tartalmazhat. Egész típusú. A tényleges típus lehet előjeles vagy előjel nélküli. CHAR_BIT biteket tartalmaz. ≥8 %c [, ] Mérete megegyezik a char méretével, de garantáltan előjeles. Legalább a [−127, +127] tartományt képes tartalmazni. ≥8 %c [, ] Mérete megegyezik a char méretével, garantáltan előjel nélküli. Legalább a [0, 255] tartományt tartalmazza. ≥8 %c [0, ] Rövid (short) előjeles egész típusú. Képes legalább a [, ] tartományt tartalmazni. ≥16 %hi vagy %hd [, ] Rövid előjel nélküli egész típusú. Legalább a [0, ] tartományt tartalmazza. ≥16 %hu [0, ] Alapvető előjeles egész szám típus. Legalább a [, ] tartományt tartalmazza. ≥16 %i vagy %d [, ] none Alapvető előjel nélküli egész szám típus. Legalább a [0, ] tartományt tartalmazza. ≥16 %u [0, ] vagy Hosszú (long) előjeles egész szám típus. Képes legalább a [, ] tartományt tartalmazni. ≥32 %li vagy %ld [, ] vagy Hosszú, előjel nélküli egész típusú. Legalább a [0, ] tartományt képes tartalmazni. ≥32 %lu [0, ] mindkét vagy és vagy Long long előjeles egész szám típus. Legalább a [, ] tartományt tartalmazhatja. A szabvány C99-es verziója óta specifikálva. ≥64 %lli vagy %lld [, ] vagy Long long előjel nélküli egész szám típus. Legalább a [0, ] range. A szabvány C99-es verziója óta van megadva. ≥64 %llu [0, ] mindkét vagy és vagy Valós lebegőpontos típus, amelyet általában egyetlen pontosságú lebegőpontos típusként emlegetnek. A tényleges tulajdonságok nincsenek meghatározva (kivéve a minimális korlátokat); azonban a legtöbb rendszeren ez az IEEE 754 egyszeres pontosságú bináris lebegőpontos formátum (32 bit). Ezt a formátumot az opcionális F. függelék, az "IEC 60559 lebegőpontos aritmetika" írja elő. Szövegből konvertálás:: vagy Valós lebegőpontos típus, amelyet általában dupla pontosságú lebegőpontos típusként emlegetnek. A tényleges tulajdonságok nincsenek meghatározva (kivéve a minimális korlátokat); azonban a legtöbb rendszeren ez az IEEE 754 dupla pontosságú bináris lebegőpontos formátum (64 bit). Ezt a formátumot az opcionális F. függelék, az "IEC 60559 lebegőpontos aritmetika" írja elő. none Valós lebegőpontos típus, általában kiterjesztett pontosságú lebegőpontos számformátumra van leképezve. A tényleges tulajdonságok nincsenek meghatározva. Lehet x86 kiterjesztett pontosságú lebegőpontos formátum (80 bit, de jellemzően 96 bit vagy 128 bit a memóriában kitöltő bájtokkal), a nem IEEE "double-double" (128 bit), az IEEE 754 négyszeres pontosságú lebegőpontos formátum (128 bit), vagy megegyezik a double formátummal. Részletekért lásd a long double-ról szóló cikket. %Lf %LF%Lg %LG%Le %LE%La %LA vagy

Az Egész típusok tényleges mérete implementációnként változik. A szabvány csak az adattípusok közötti méretrelációkat és az egyes adattípusok minimális méretét írja elő:

A relációs követelmények a következők: a long long nem lehet kisebb, mint a long, ami nem kisebb, mint az int, ami nem kisebb, mint a short. Mivel a char mérete mindig a minimálisan támogatott adattípus, ezért egyetlen más adattípus (a bitmezők kivételével) sem lehet kisebb ettől.

A char minimális mérete 8 bit, a short és int értékeké 16 bit, a long értékeké 32 bit, a long long értékeknek pedig legalább 64 bitet kell tartalmazniuk.

Az int típusnak azt az egész számtípust kell használnia, amellyel a célprocesszor a leghatékonyabban dolgozik. Ez nagy rugalmasságot biztosít: például minden típus lehet 64 bites. Azonban számos különböző egész szám szélességű séma (adatmodell) népszerű. Mivel az adatmodell határozza meg, hogyan kommunikálnak a különböző programok, egy adott operációs rendszer alkalmazásfelületén belül egységes adatmodellt használnak.

A gyakorlatban a char általában 8 bites, a short pedig általában 16 bites méretű (ahogy az előjel nélküli megfelelőik is). Ez olyan változatos platformokra igaz, mint az 1990-es évekbeli SunOS 4 Unix, a Microsoft MS-DOS, a modern Linux és a Microchip MCC18 a beágyazott 8 bites PIC mikrovezérlőkhöz. A POSIX megköveteli, hogy a char pontosan 8 bites méretű legyen.

A C szabványban található különféle szabályok teszik az előjel nélküli karaktert (unsigned char) az alapvető típussá, amelyet tetszőleges, nem bitmezős objektumok tárolására alkalmas tömbökhöz használnak: a kitöltő bitek és a trapA trap (csapda) a program hibamentesítését, debuggolását támogatja. reprezentációk hiánya, az objektumreprezentáció definíciója, és az aliasingA számítástechnikában az aliasing olyan helyzetet ír le, amelyben a memóriában lévő adathelyhez a programban különböző szimbolikus neveken keresztül lehet hozzáférni. Így az adatok egyetlen névvel történő módosítása implicit módon módosítja az összes alias névhez tartozó értékeket, amire a programozó nem feltétlenül számít. Ennek eredményeként az aliasing különösen megnehezíti a programok megértését, elemzését és optimalizálását. lehetősége.

A lebegőpontos típusok tényleges mérete és viselkedése implementációnként is változik. Az egyetlen követelmény, hogy a long double ne legyen kisebb, mint a double, ami viszont nem kisebb, mint a float. A float és a double értékekhez általában a 32 bites, illetve a 64 bites IEEE 754 bináris lebegőpontos formátumot használják.

A C99 szabvány új valós lebegőpontos típusokat tartalmaz, a float_t és a double_t típusokat, amelyeket a <math.h> fájlban definiálunk. Ezek megfelelnek a lebegőpontos kifejezések közbenső eredményeihez használt típusoknak, amikor az FLT_EVAL_METHOD értéke 0, 1 vagy 2. Ezek a típusok szélesebbek lehetnek, mint a long double.

A C99-es verzióban komplex típusokat is hozzáadtunk: float _Complex, double _Complex, long double _Complex. A C11-es verzióban képzetes típusokat is hozzáadtunk (amelyeket a C99 informatív mellékletében ismertettünk): float _Imaginary, double _Imaginary, long double _Imaginary. A <complex.h> fejléc beillesztése lehetővé teszi, hogy mindezen típusok elérhetők legyenek a komplex, illetve képzetes típusokkal.

Logikai típus A C99 hozzáadott egy _Bool logikai adattípust. Ezenkívül az <stdbool.h> fejléc a bool értéket definiálja a típus kényelmes álneveként, és makrókat is biztosít a true (igaz) és false (hamis) értékekhez. A _Bool hasonlóan működik, mint egy normál egész típus, egy kivétellel: bármely _Bool típusúra való konvertálás 0-t (hamis) ad, ha az érték 0; egyébként 1-et (igaz) ad. Ez a viselkedés az egész szám túlcsordulásainak elkerülésére szolgál az implicit szűkítő konverziók során. Például a következő kódban:

unsigned char b = 256;

if (b) { /* do something */ }

A b változó hamis értéket ad vissza, ha az mérete 8 bit. Ez azért van, mert a 256-os érték nem illik az adattípusba, aminek következtében az alsó 8 bitje kerül felhasználásra, ami nulla értéket eredményez. A típus megváltoztatása azonban az előző kód normál működését eredményezi: _Bool b = 256;

if (b) { // do something }

A típus azt is biztosítja, hogy az igaz értékek mindig egyenlőek legyenek egymással: _Bool a = 1; _Bool b = 2;

if (a == b) { // this code will run }

A C23-ban a bool (és annak true és false értékei) a nyelv alapvető funkciójává vált (ezáltal az <stdbool.h> tartalma elavulttá vált), lehetővé téve a következő kódpéldát: bool b = true;

if (b) { // this code will run }

Bitpontos egész számtípusok A C23 óta a nyelv lehetővé teszi a programozó számára, hogy tetszőleges számú bit szélességű egész számokat definiáljon. Ezeket a típusokat _BitInt(N) alakban adjuk meg, ahol N egy egész szám konstans kifejezés, amely a kettes komplementerben ábrázolt bitek számát jelöli, beleértve az előjeles típusok előjelbitjét is. Az N maximális értékét a BITINT_MAXWIDTH adja meg, és legalább ULLONG_WIDTH. Ezért a _BitInt(2) típus (vagy signed _BitInt(2)) −2 és 1 közötti értékeket vehet fel, míg az unsigned _BitInt(2) 0 és 3 közötti értékeket. Az unsigned _BitInt(1) típus is létezik, amely vagy 0, vagy 1, és nincs vele egyenértékű előjeles típusa. Egy C2Y-re vonatkozó javaslat szerint feloldják ezt a korlátozást, és engedélyezik az előjeles _BitInt(1)-et, amelynek ekkor a lehetséges értékei 0 és -1, megszüntetve az unsigned _BitInt(1) speciális esetét.

Interfész az alaptípusok tulajdonságaihoz Az alapszámtani típusok tényleges tulajdonságairól, például a méretéről, információkat makrókonstansok biztosítanak két fejlécben: a <limits.h> fejléc (climits fejléc C++-ban) egész típusú makrókat, a <float.h> fejléc (cfloat fejléc C++-ban) pedig lebegőpontos típusokhoz tartozó makrókat definiál. A tényleges értékek a megvalósítástól függenek

Egész típusok tulajdonságai CHAR_BIT – a karakter típus mérete bitben, általában egy bájt méretének nevezik (legalább 8 bit) SCHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MIN(C99) – Az előjeles egész szám típusok minimális lehetséges értéke: signed char, signed short, signed int, signed long, signed long long SCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX(C99) – az előjeles egész típusú számok maximális lehetséges értéke: signed char, signed short, signed int, signed long, signed long long UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, ULLONG_MAX(C99) – előjel nélküli egész típusú számok maximális lehetséges értéke: unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long CHAR_MIN – a minimálisan lehetséges char érték CHAR_MAX – a char maximális lehetséges értéke MB_LEN_MAX – maximális bájtszám egy több-bájtos karakterben BOOL_WIDTH (C23) – _Bool bitszélessége, mindig 1 CHAR_WIDTH (C23) – char bitszélessége; CHAR_WIDTH, UCHAR_WIDTH és SCHAR_WIDTH definíció szerint egyenlőek CHAR_BIT-tel SCHAR_WIDTH, SHRT_WIDTH, INT_WIDTH, LONG_WIDTH, LLONG_WIDTH (C23) – a signed char bitszélessége, rendre short, int, long, és long long UCHAR_WIDTH, USHRT_WIDTH, UINT_WIDTH, ULONG_WIDTH, ULLONG_WIDTH (C23) – Az unsigned char, unsigned short, unsigned int, unsigned long és unsigned long long bitszélessége rendre.

Lebegőpontos típusok tulajdonságai FLT_MIN, DBL_MIN, LDBL_MIN – a float, double és long double minimális normalizált pozitív értéke FLT_TRUE_MIN, DBL_TRUE_MIN, LDBL_TRUE_MIN (C11) – a float, double és long double minimális pozitív értéke FLT_MAX, DBL_MAX, LDBL_MAX – a float, double és long double maximális véges értéke FLT_ROUNDS – kerekítési mód lebegőpontos műveletekhez FLT_EVAL_METHOD (C99) – különböző lebegőpontos típusokat tartalmazó kifejezések kiértékelési módszere FLT_RADIX – a kitevő alapja lebegőpontos típusokban FLT_DIG, DBL_DIG, LDBL_DIG – A float, double és long double értékekkel a pontosság elvesztése nélkül ábrázolható decimális jegyek száma FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON – 1,0 és a float, double és long double következő reprezentálható értéke közötti különbség