Types de données en C

28 Aug 2019 28 Aug 2019 9257 vues ESSADDOUKI Mostafa 6 min de lecture

Types de données en C

Définition — Type de données Un type de données définit la nature des valeurs qu'une variable peut stocker, la quantité de mémoire allouée et l'ensemble des opérations applicables. En C, chaque variable doit avoir un type déclaré explicitement — le compilateur refuse toute variable sans type.
FamilleTypesUsage principal
Entierschar, short, int, long, long longNombres entiers, caractères ASCII
Réelsfloat, double, long doubleNombres à virgule flottante
VidevoidAbsence de valeur (retour de fonction, pointeur générique)

1. Types de base

a. char — Caractère

char Type entier le plus petit (1 octet). Stocke un code ASCII compris entre 0 et 127. Chaque caractère est représenté entre apostrophes : 'A', '0', '\n'.
char lettre  = 'A';    /* code ASCII 65  */
char chiffre = '5';    /* code ASCII 53  */
char newline = '\n';   /* code ASCII 10  */

printf("%c → %d\n", lettre, lettre);   /* A → 65 */

b. int — Entier

int Type entier signé, de taille 4 octets sur la plupart des architectures 32/64 bits. Plage habituelle : −2 147 483 648 à 2 147 483 647.

c. float et double — Réels

TypeTaillePrécisionSpécificateurExemple
float4 octets~7 chiffres significatifs%f3.14f
double8 octets~15 chiffres significatifs%lf3.14159265
long double12 ou 16 octets~18–19 chiffres significatifs%Lf3.14159265358979L
Astuce — Choisir entre float et double Préférer double par défaut pour les calculs numériques : la précision supplémentaire évite les erreurs d'arrondi cumulées. N'utiliser float que lorsque la mémoire est contrainte (tableaux massifs, GPU). Les littéraux réels sont de type double par défaut en C — ajouter le suffixe f pour un littéral float : 3.14f.

2. Tableau complet des types (gcc 32 bits)

TypeTaille (octets)Plage de valeursSpécificateur printf
signed char1−128 à 127%c / %hhd
unsigned char10 à 255%c / %hhu
short int2−32 768 à 32 767%hd
unsigned short int20 à 65 535%hu
int4−2 147 483 648 à 2 147 483 647%d
unsigned int40 à 4 294 967 295%u
long int4−2 147 483 648 à 2 147 483 647%ld
unsigned long int40 à 4 294 967 295%lu
long long int8−(2⁶³) à (2⁶³)−1%lld
unsigned long long int80 à 18 446 744 073 709 551 615%llu
float4±3.4 × 10⁻³⁸ à ±3.4 × 10³⁸ (~7 chiffres)%f
double8±1.7 × 10⁻³⁰⁸ à ±1.7 × 10³⁰⁸ (~15 chiffres)%lf
long double12±3.4 × 10⁻⁴⁹³² à ±3.4 × 10⁴⁹³² (~18 chiffres)%Lf
Tailles dépendantes de l'architecture Les tailles indiquées correspondent à un compilateur gcc 32 bits. Sur un système 64 bits, certains types peuvent différer (notamment long qui fait 8 octets sous Linux 64 bits). Pour écrire du code portable avec des tailles garanties, utiliser les types de <stdint.h>:
#include <stdint.h>

int8_t   a;   /* exactement 1 octet signé   */
uint16_t b;   /* exactement 2 octets non signé */
int32_t  c;   /* exactement 4 octets signé  */
int64_t  d;   /* exactement 8 octets signé  */

3. Le type void

void — Absence de type void est un type incomplet signifiant l'absence de valeur. Il est utilisé dans trois contextes distincts : type de retour d'une fonction sans résultat, paramètre d'une fonction sans argument, et pointeur générique (void *).
UsageSyntaxeSignification
Retour de fonctionvoid afficher(void)La fonction ne retourne rien
Paramètre videint main(void)La fonction n'accepte aucun argument
Pointeur génériquevoid *ptrPointeur sans type précis (malloc)
Attention — On ne peut pas déclarer une variable void voidest un type incomplet — aucune variable de ce type ne peut être créée :
void x;          /* Erreur : variable de type void interdite */
void *p = NULL;  /* Correct : pointeur générique sur void    */

4. L'opérateur sizeof

sizeof — Taille en mémoire L'opérateur sizeof retourne la taille en octets d'un type ou d'une variable. Il est évalué à la compilation (pas à l'exécution) et retourne une valeur de type size_t (entier non signé — spécificateur %zu ou %lu).

Syntaxe C
sizeof(type)      /* taille du type          */
sizeof(variable)  /* taille de la variable   */
sizeof(expression)/* taille du résultat      */

Exemple n°1 — Tailles des types fondamentaux

#include <stdio.h>

int main(void)
{
    int    a = 2;
    double b = 3.14;
    char   c = 'A';

    /* sizeof sur types */
    printf("sizeof(char)        = %lu octet(s)\n", sizeof(char));
    printf("sizeof(short)       = %lu octet(s)\n", sizeof(short));
    printf("sizeof(int)         = %lu octet(s)\n", sizeof(int));
    printf("sizeof(long)        = %lu octet(s)\n", sizeof(long));
    printf("sizeof(long long)   = %lu octet(s)\n", sizeof(long long));
    printf("sizeof(float)       = %lu octet(s)\n", sizeof(float));
    printf("sizeof(double)      = %lu octet(s)\n", sizeof(double));
    printf("sizeof(long double) = %lu octet(s)\n", sizeof(long double));

    /* sizeof sur variables */
    printf("\nsizeof(a) = %lu octet(s)\n", sizeof(a));   /* int  → 4 */
    printf("sizeof(b) = %lu octet(s)\n", sizeof(b));     /* double → 8 */
    printf("sizeof(c) = %lu octet(s)\n", sizeof(c));     /* char → 1 */

    return 0;
}
Sortie
sizeof(char)        = 1 octet(s)
sizeof(short)       = 2 octet(s)
sizeof(int)         = 4 octet(s)
sizeof(long)        = 4 octet(s)
sizeof(long long)   = 8 octet(s)
sizeof(float)       = 4 octet(s)
sizeof(double)      = 8 octet(s)
sizeof(long double) = 12 octet(s)

sizeof(a) = 4 octet(s)
sizeof(b) = 8 octet(s)
sizeof(c) = 1 octet(s)

Exemple n°2 — Débordement de type (overflow)

#include <stdio.h>

int main(void)
{
    unsigned char uc = 255;
    printf("uc = %d\n", uc);     /* 255 */

    uc = uc + 1;                 /* 255 + 1 = 256 → débordement */
    printf("uc + 1 = %d\n", uc); /* 0  — retour à zéro (modulo 256) */

    int max = 2147483647;
    printf("max     = %d\n", max);      /*  2147483647 */
    printf("max + 1 = %d\n", max + 1);  /* -2147483648 — comportement indéfini pour int signé */

    return 0;
}
Sortie
uc = 255
uc + 1 = 0
max     = 2147483647
max + 1 = -2147483648
Danger — Débordement entier (integer overflow) Dépasser la plage d'un type produit un débordement. Pour les types non signés, le résultat est garanti modulo 2ⁿ (comportement bien défini). Pour les types signés, le débordement est un comportement indéfini en C — le compilateur peut produire n'importe quel résultat. Vérifier toujours les bornes avant une opération critique, ou utiliser un type plus grand.

Récapitulatif

TypeTailleUsage recommandéSpécificateur
char1 octetCaractère ASCII, petit entier%c
short2 octetsEntier court (mémoire contrainte)%hd
int4 octetsEntier courant (compteurs, indices)%d
long long8 octetsGrands entiers, calculs 64 bits%lld
float4 octetsRéel simple précision (GPU, tableaux)%f
double8 octetsRéel double précision (usage général)%lf
voidRetour de fonction, pointeur générique
sizeofConnaître la taille d'un type à la compilation%lu

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.