En pratique, dans la mémoire d'un ordinateur, il n'y a pas d'entiers ni de nombres réels. Tout est stocké en binaire et n'est qu'une question d'interprétation de ces mots binaires, d'où la nécessité de typer des variables. Le typage permet de savoir comment convertir le binaire en entier ou en nombre décimaux. La même donnée interprétée comme un entier ou comme un flottant donnera des valeurs différentes. Voici un exemple qui est d'ailleurs une erreur classique du développeur débutant :
float i=28;
printf ("%d", i);
Ce programme n'affiche pas 28. On déclare une variable de type float
, mais au moment de
l'affichage, on utilise le code de format %d
qui va (au mieux) interpréter la variable
comme un entier. Notons que certains compilateurs vont détecter le problème en
affichant un avertissement.
Il en va de même pour la mémorisation des caractères. Dans la mémoire, il n'y a que des uns et des zéros. Il a donc fallu associer chaque valeur binaire à un caractère. C'est dans ce but qu'a été inventée la table ASCII.
La table ASCII est une table qui associe un caractère à chaque valeur binaire. Initialement,
la table ASCII contenait 128 caractères, principalement anglo-saxons. Elle a ensuite été
étendue à 256 pour inclure des caractères étrangers, comme par exemple la cédille française ç
.
Des versions différentes co-existent pour chaque langue, mais normalement les 128 premiers
caractères sont universels. L'image ci-dessous illustre cette table ASCII (source : Université de Lille 1)
Le codage des caractères a continué d'évoluer avec notamment l'UTF-8 et l'Unicode. Unicode est conçu pour coder l’ensemble des caractères du répertoire universel de caractères, qui inclut les alphabets asiatiques, les émojis ... Ces codages modernes ne sont pas supportés nativement par le C, mais il est remarquable de noter que ces standards ont été conçus pour rester retro-compatible avec la table ASCII. Pour en savoir plus, je ne peux que vous inviter à découvrir cette merveilleuse vidéo de la chaine Computerphile (en anglais) :
Le type char
, comme son nom l'indique, est destiné à la mémorisation des
caractères (en anglais, caractère se traduit par character). Un char
occupe 1 octet en mémoire.
Avec ces 8 bits, il est possible de coder 256 valeurs, ce qui permet
d'y stocker un caractère de la table ASCII étendue.
Par exemple le code ci-dessous déclare une variable lettre
et y affecte le caractère C
:
char lettre = 'C';
Notez les guillemets simple qui stipulent qu'il s'agit d'un caractère.
Le code de format permettant d'afficher un caractère est %c
. Vous l'aurez normalement
déjà compris, le type char
est fréquemment utilisé pour mémoriser de petits entiers. Pour
afficher un char
sous forme décimale, il faudra utiliser le code de format %d
. L'exemple
suivant montre comment afficher le caractère C sous forme de caractère et sous forme d'entier :
char lettre = 'C';
printf ("Sous forme de caractère : %c\n", lettre);
printf ("Sous forme d'entier : %d\n", lettre);
On constate que la lettre C
s'affiche bien sous forme de caractère avec le code de
format %c
. De plus, lorsque l'on affiche la variable sous forme d'entier (%d
), on
constate que la lettre C majuscule a bien pour code ASCII 67 comme vous pourrez le vérifier dans
la table ASCII ci-dessus.
Supposons que l'on ait déclaré une variable i
et que l'on souhaite affecter
la lettre i
dans une autre variable. Comment le compilateur va différencier
la variable i
du caractère i
?
Il existe une syntaxe en C qui permet de différencier les variables des caractères : un caractère est toujours écrit entre guillemets simples :
char a = i; // Il s'agit de la variable i
char b = 'i' // Il s'agit de la lettre i
char c = 8 // Il s'agit du chiffre 8
char c = '8' // Il s'agit du caractère 8 pour code ASCII 56
Nous y reviendrons plus tard, mais notez que les chaînes de caractères (autrement dit du texte) sont encadrées par des guillemets doubles. Ne confondez pas
printf
.Comment feriez-vous pour affecter le caractère guillement simple à une variable ? Vous comprendrez aisément que la syntaxe ci-dessous est problématique :
char c = ''';
Pour résoudre ce problème, le C définit des caractères spéciaux, ceux-ci commencent par un anti-slash. La bonne solution pour assigner un guillemet simple est :
char c = '\'';
Voici quelque-uns des caractères spéciaux nous utiliserons dans la suite de ce cours :
Syntaxe | Code ASCII | Description |
---|---|---|
\t |
9 | tabulation |
\n |
10 | retour à la ligne |
\" |
34 | guillemet double |
\' |
39 | guillemet simple |
\\ |
92 | anti-slash |
\% ou %% |
37 | pourcentage |
Écrire un programme qui déclare 3 variables de types char
:
tabulation
initialisé avec une tabulationretour_ligne
initialisé avec un retour à la ligneanti_slash
initilaisé avec un anti-slashPour chaque variable, affichez son contenu sous forme décimale.
Voici la sortie espérée :
Tabulation => 9
retour à la ligne => 10
Anti-slash => 92
Écrire un programme qui affiche le caractère '9' sous forme de caractère et sous forme entier.
Voici l'affichage attendu :
Sous forme de caractère : 9
Sous forme d'entier : 57
Vérifiez dans la table ASCII que le code du caractère '9' est bien 57.
Écrire un programme qui affiche le caractère n°9 de la table ASCII sous forme de caractère et sous forme d'entier.
Voici l'affichage attendu :
Sous forme de caractère : .
Sous forme d'entier : 9.
Expliquez cet affichage.
Comment sont stockées les variables dans la mémoire ?
Quelle place occupe un char
en mémoire ?
char
occupe 1 octets (8 bits) en mémoire.
Essaie encore ...
À quoi peut servir une variable de type char
?
char
initialement dédié aux caractères est parfois utilisé pour de petite entiers.
Essaie encore ...
Qu'est-ce que la table ASCII ?
Que veut dire ASCII ?
Qu'affiche le programme suivant ?
char c = 'P';
printf ("%c", c);
Qu'affiche le programme suivant ?
char c = 'P';
printf ("%d", c);
Qu'affiche le programme suivant ?
char c = 80;
printf ("%c", c);
Qu'affiche le programme suivant ?
char c = 80;
printf ("%d", c);
Qu'affiche le programme suivant ?
char c = 'w';
printf ("%c ", c);
printf ("%d ", c);
Qu'affiche le programme suivant ?
char c = 128;
printf ("%d ", c);
char
est compris entre -128 et 127.
Essaie encore ...