Donnée
Un programme manipule donc des données. Par exemple, le nom ou le prénom d'une personne, sa date de naissance ou encore son adresse. On peut aussi penser à des données plus complexes telles que toutes les grilles horaires des trains, ou l'arbre généalogique d'une famille. De manière générale, toute donnée possède un type qui caractérise cette donnée.
Dans ce chapitre, on va commencer par analyser des données simples comme par exemple le poids d'un sachet de chips. De manière générale, il s'agit d'un nombre entier positif donné en grammes, par exemple 350g. On va voir trois types de donnée dans ce chapitre : les nombres entiers, les nombres flottants, et les caractères.
Les données sont au final stockées dans la mémoire de l'ordinateur, et occupent une certaine quantité de mémoire. Chaque type de donnée est notamment caractérisé par l'espace mémoire utilité pour stocker une donnée de ce type. Puisque l'espace mémoire réservé pour un type de donnée est fixe, cela signifie que lorsqu'on choisit un type de donnée, on ne pourra pas stocker tout ce que l'on veut, mais uniquement certaines données.
Prenons un exemple pour comprendre cela. Supposons que l'on travaille avec un type de donnée qui est limité à un bit en mémoire. Avec un bit, on ne peut stocker que deux valeurs différentes : 0 et 1. Avec ce type de données, on ne pourra donc stocker que deux données différentes en tout. Pour les différents types décrit dans ce chapitre, un point important sera donc l'espace mémoire qu'ils utilisent. Comme on va le voir, cet espace mémoire dépend notamment de la machine utilisée. Dans ce livre, les exemples montrés sont exécutés sur une machine 64 bits avec un processeur Intel Core i7.
Nombre entier
Le premier type de données permet de représenter des nombres entiers. On utilise par exemple ce type de données pour stocker l'âge d'une personne, le nombre d'habitants d'un pays, le nombre d'élèves dans une classe, le code postal d'une ville... Il existe en C quatre types pour les nombres entiers, à savoir short
, int
, long int
et long long
. La différence entre ces quatre types concerne le nombre de valeurs différentes qu'il est possible de représenter.
La figure 1 reprend les quatre types avec les bornes minimales et maximales des valeurs représentables. On remarque par exemple que les types long int
et long long
sont identiques sur cette machine. On verra plus loin dans ce livre comment obtenir ces valeurs pour votre propre machine.
Type | Valeur minimale | Valeur maximale |
---|---|---|
short |
-32 768 | 32 767 |
int |
-2 147 483 648 | 2 147 483 647 |
long int |
-9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
long long |
-9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
Les quatre types de données que l'on vient de voir sont appelés des types signés, c'est-à-dire qu'ils permettent de représenter des valeurs avec un signe (positif ou négatif). On n'a pas toujours besoin de cette possibilité car on est parfois limité aux seuls nombres positifs. C'est par exemple le cas si l'on souhaite stocker un âge ou un nombre d'élèves dans une classe. Il est possible en C de signaler qu'on se limite aux valeurs positives. Les quatre types existent en fait en version signed
(avec signe) et unsigned
(sans signe). Lorsqu'on ne dit rien, c'est par défaut qu'on utilise la version signed
.
L'avantage d'utiliser les versions unsigned
est qu'il est alors possible de stocker plus de valeurs différentes possibles pour les quatre types de données comme on peut le voir sur la figure 2.
Type | Valeur minimale | Valeur maximale |
---|---|---|
unsigned short |
0 | 65 535 |
unsigned int |
0 | 4 294 967 295 |
unsigned long int |
0 | 18 446 744 073 709 551 616 |
unsigned long long |
0 | 18 446 744 073 709 551 616 |
La figure 3 reprend l'espace mémoire occupé par les quatre types de données. Cet espace mémoire occupé est le même pour les versions signed
et unsigned
des quatre types de données et on verra plus loin dans le livre comment obtenir ces tailles pour votre propre machine.
Type | Espace mémoire |
---|---|
unsigned short |
2 octets |
unsigned int |
4 octets |
unsigned long int |
8 octets |
unsigned long long |
8 octets |
Nombre flottant
On peut aussi vouloir représenter des nombres à virgule. On utilise par exemple ce type pour stocker le poids d'une personne en kilogrammes, la distance entre deux villes, le prix d'un article en euros, la consommation d'essence d'une voiture en litres aux 100 kilomètres... Il existe pour cela trois types en C, à savoir float
, double
et long double
.
De manière précise, on parle de nombre flottant car tous les nombres à virgule ne peuvent en fait pas être représentés comme on le verra au chapitre suivant. De plus, contrairement aux nombres entiers, tous les types pour les nombres flottants sont d'office signés. La figure 4 reprend les trois types avec les bornes minimales et maximales des valeurs représentables, et avec l'espace mémoire occupé.
Type | Espace mémoire | Valeur minimale | Valeur maximale |
---|---|---|---|
float |
4 octets | 1,2.10-38 | 3,4.1038 |
double |
8 octets | 2,2.10-308 | 1,7.10308 |
long double |
16 octets | 3,4.10-4932 | 1,2.104932 |
Caractère
Enfin, terminons avec le dernier type de données élémentaire qui permet de représenter des caractères. On va par exemple utiliser ce type pour stocker le sexe d'une personne (M
ou F
), la taille d'un paquet de frites (S
, M
ou L
), ou tout simplement une lettre de l'alphabet... Il n'y a qu'un seul type en C, à savoir char
.
Comme détaillé au chapitre suivant, tout caractère est en fait associé à un nombre entier positif. Cette association est faite grâce à une table de caractères. En fait, un caractère peut être vu comme un nombre entier signé.
Le type char
occupe un seul octet en mémoire et permet donc de représenter les nombres de 0 à 127 (à savoir 128 caractères différents). Lorsqu'on doit écrire une donnée de type caractère, on doit écrire le caractère en question entre guillemets simples (apostrophe). On écrira donc par exemple 's'
ou 'C'
.