Types de base

Écrit le 10/11/2004 par Wikibooks
Dernière mise à jour : 02/02/2006

Entiers

Il y a quatre types de variables entières (integer en anglais) :

Le langage ne définit pas exactement la taille de ces différents types, mais définit une relation d'ordre entre eux :

char ≤ short ≤ int ≤ long ≤ long long

Les types entiers peuvent prendre les modificateurs signed et unsigned qui permettent respectivement d'obtenir un type signé ou non signé. Ces modificateurs ne changent pas la taille des types.

Constantes

Il existe différentes suites de caractères qui sont reconnues comme étant des constantes entières :

Par défaut une constante numérique est de type int. Cela peut s'avérer insuffisant et être problématique lors de passage de paramètres à des fonctions à nombre variable d'arguments, par exemple. Il peut-être judicieux de forcer le type de la constantes en la postfixant des attributs suivants :

C'est en fait une façon plus rapide de faire un transtypage. Exemples :

unsigned long long max = ~ 0ULL;   /* 18446744073709551615 si sizeof max == 8 */
long               min = 1L << 31; /* -2147483648 si sizeof min == 4 */

Réels

Les réels sont approximés par des décimaux, c'est-à-dire des nombres à virgule flottante.
Comme dans le cas des entiers, il existe plusieurs types de nombres à virgule flottante. En voici la liste triée par précision croissante :

Constantes

Une suite de caractères représente une constante réelle si :

Dans le deuxième cas, le nombre peut être soit un entier, soit un réel du premier cas.

Arithmétique

Une attention particulière doit être portée sur la précision des types réels. Ces différents types ne font qu'approximer l'ensemble des nombres réels, avec une précision finie. Des erreurs d'arrondis sont à prévoir, ce qui est très problématique pour des domaines qui n'en tolèrent pas (notamment pour les applications financières, il est conseillé de ne pas utiliser les types réels du C). Le type float en particulier est d'une précision aléatoire, dépendante du coprocesseur utilisé. Sur une machine Intel, voici un exemple classique d'erreur à ne pas faire :

float i;
for( i = 0.0; i < 100.0; i += 0.1 );
printf("i = %g\n", i);               /* 100.099 */

On constate que la précision du type float est (très) mauvaise, d'autant plus que la constante 0.1 se prête mal à la représentation utilisée en interne par la plupart des coprocesseurs. Il est d'ailleurs conseillé d'utiliser le type double autant que possible, et d'éviter de convecoir des algorithmes avec des accumulations d'erreurs infinitésimales. Le code ci-dessus aurait pu être réécrit :

int i;
for( i = 0; i < 1000; i ++ )
{
     float indice = i * 0.1;
}

C'est plus couteux, mais permet d'avoir une précision nettement meilleure que le code précédant.

Caractères

Le type permettant de représenter un caractère est char. Ce type définit aussi la base de calcul pour tous les autres types du langage. Par définition sizeof(char) est toujours 1. Le nombre de bits utilisés pour représenter un char peut varier d'une implémentation à l'autre. En général les compilateurs utilisent 8 bits.

Si on reprend la relation d'ordre définie pour les entiers alors :

char ≤ short

Le type caractère peut aussi être signed ou unsigned.

Constantes

Une constante caractère est délimitée par des quotes, il existe certaines constantes caractères aux valeurs particulières :

Trigraphe

Cette fonctionnalité obscure et peu employée est en général à éviter, tant elle a peu d'estime. Néanmoins de très rares programmes peuvent utiliser ce genre de fonctionnalités. Un trigraphe est simplement une suite de trois caractères qui sera remplacé par un seul, notamment sur des architectures dont l'alphabet ne dispose pas des caractères que les trigraphes remplacent. Par défaut, la plupart des compilateurs désactivent les trigraphes, au cas où vous ne serez pas encore dissuadé de les utiliser.

Trigraphe Caractère
??= #
??( [
??) ]
??< {
??> }
??/ \
??' ^
??! ~

Chaîne de caractères

Une chaîne de caractère, comme son nom l'indique, est une suite de caractères avec la particularité d'avoir un caractère nul (0) à la fin. Une chaîne de caractère est en fait implémentée en C avec un tableau de type char.

Sous sa forme la plus simple, on déclare une chaîne comme une suite de caractères entre guillemets (double quote) :

"Ceci est une chaîne de caractère";
""; /* Chaîne vide */

Si la chaîne est trop longue, on peut aussi la couper sur plusieurs lignes :

"Ceci est une chaîne de caractère, " /* pas de ; */
"déclarée sur plusieurs lignes.";

Deux chaînes côtes à côtes (modulo les espaces et les commentaires) seront concaténées par le compilateur. De plus on peut utiliser le caractère barre oblique inverse (\) pour annuler la signification spéciale de certains caractères ou utiliser des caractères spéciaux (C.f liste ci-dessus).

"Une chaîne avec des \"guillemets\" et une barre oblique (\\)\n";

Les chaînes de caractères faisant appel aux concepts de pointeur, tableau et de zone mémoire statique, leur utilisation plus poussée sera décrite dans la section dédiée aux tableaux.

À noter la représentation obsolète des chaînes de caractères multilignes. À éviter dans la mesure du possible :

/* Ce code est obsolète et à éviter */
"Ceci est une chaîne de caractère, 
déclarée sur plusieurs lignes";

Booléens

Le langage ne fournit pas de type booléen, la valeur entière 0 a la valeur de vérité faux et toutes les autres valeurs entières ont la valeur de vérité vrai.

Vide

En plus de ces types, le langage C fournit un autre type, void qui représente rien, le vide. Il n'est pas possible de déclarer une variable de type void. Nous verrons l'utilité de ce type lorsque nous parlerons de fonctions et de pointeurs.

Cet article provient de Wikibooks et est sous licence GNU Free Documentation License. Il a été écrit par plusieurs personnes et est constamment mis à jour. Cet article est la version du 5 janvier 2005 à 01:57. L'article d'origine se trouve à http://fr.wikibooks.org/wiki/Programmat ... es_de_base.