Voici tous les types entiers prédéfinis en C :
Type | Nombre usuel de bits | Formats | Exemple |
---|---|---|---|
signed char | 8 | %c, %hhd, %hhi | 'Y' |
unsigned char | 8 | %c, %hhu, %hho, %hhx, %hhX | 'z' |
short int | 16 | %hd, %hi | |
unsigned short int | 16 | %hu, %ho, %hx, %hX | |
int | 32 | %d, %i | -24 |
unsigned int | 32 | %u, %o, %x, %X | 97U |
long int | 64 | %ld, %li | -148L |
unsigned long int | 64 | %lu, %lo, %lx, %lX | 4UL |
Et voici tous les types réels prédéfinis en C :
Type | Nombre usuel de bits | Formats | Exemple |
---|---|---|---|
float | 32 | %f, %e, %E, %g, %a | 1.5f |
double | 64 | %lf, %le, %lE, %lg, %la | 87.2 |
long double | 128 | %Lf, %Le, %LE, %Lg, %La | 4.61L |
Notez bien que printf utilise les formats des float pour les double et ne permet pas d'afficher les float.
Lorsque le type d'une donnée ne correspond pas à l'usage que l'on souhaite en faire, il est possible de la convertir, c'est à dire de former une nouvelle valeur d'un autre type aussi proche que possible de la valeur de départ. Le terme technique est transtypage, mais on utilise aussi conversion ou coercition.
Il arrive bien souvent qu'une telle conversion se produise sans qu'on l'ait demandée : elle est alors implicite.
double x = 1;Dans cet exemple, la notation choisie pour la valeur 1 sous-entend qu'il s'agit d'un entier. Mais une variable de type double ne peut pas recevoir un entier, donc avant que l'affectation puisse avoir lieu il faudra convertir la valeur 1 en une valeur de type double.
Même si le compilateur est capable de détecter ces situations et de produire un programme opérationnel malgré de telles incohérences dans le fichier source, il n'est pas souhaitable de s'appuyer sur ce mécanisme.
En premier lieu, parce que cela peut dissimuler des erreurs : l'exemple précédent était peut-être dû à un copier-coller malheureux oubliant la partie décimale. Dans ce cas, nous préférerions que le compilateur nous signale le problème plutôt que de le corriger incorrectement et silencieusement.
Et surtout, s'appuyer sur des mécanismes implicites nuit à la lisibilité. Un lecteur peu attentif risque de ne pas réaliser ce que fait vraiment le programme. Au cas où une conversion peu judicieuse cause un problème, il sera très difficile de corriger du code invisible !
double x = (double) 1;En supposant que la conversion soit assumée et volontaire, mieux vaut la rendre explicite. L'opérateur de conversion s'écrit comme un type entre parenthèses. Il convertit la valeur qui vient immédiatement après dans le type indiqué.
Remarque Cet opérateur est plus prioritaire que les opérations arithmétiques. En cas de doute, n'hésitez pas à user de parenthèses pour clarifier l'ordre des calculs.
double x = (double) 18/4; /* donne 4.5 */ double y = (double) (18/4); /* donne 4.0 */
Variété. Écrivez un programme qui affiche la valeur 77 autant de fois que possible, en utilisant à chaque fois un type différent.
Débordement. Écrivez un programme qui demande à l'utilisateur un entier, le stocke dans une variable de type int puis dans une variable de type char avant de l'afficher.
Testez votre programme en entrant les valeurs 65, -65, 191, puis 321. Comprenez-vous comment la conversion fonctionne ?
Affluence. Un magasin est ouvert du lundi au vendredi. Chaque jour, un employé compte le nombre de visiteurs à franchir ses portes, afin d'avoir une idée de la fréquentation moyenne.
Écrivez un programme qui demande à l'utilisateur le nombre de visiteurs pour chaque jour de la semaine, puis affiche le nombre moyen de visiteurs par jour.
Monnaie. Ce même magasin vend 5,49€ un produit très demandé, mais il n'accepte ni chèque, ni carte de paiement. Ses caisses n'ont que des pièces de 2€, 20¢ et 1¢.
Écrivez un programme qui demande à l'utilisateur combien le client a payé, puis affiche comment rendre la monnaie avec le moins de pièces possible.