Exemples d'utilisation

L'opérateur de conversion est devenu moins utile avec la normalisation du langage C. Dans K&R C, il était utilisé essentiellement pour deux raisons :
  1. à cause de l'absence de pointeur générique void *. En effet, les procédures d'allocation de mémoire comme malloc étaient définies par :
    extern char * malloc();
    
    ce qui nécessitait d'utiliser l'opérateur de conversion de type à chaque utilisation :
    p1 = (struct s1 *) malloc(sizeof(struct s1));
    p2 = (struct s2 *) malloc(sizeof(struct s2));
    

  2. à cause de l'absence de prototype de fonction qui rendait impossible la déclaration du type des paramètres des fonctions externes. Si une procédure p attendait un paramètre de type float, et si on désirait lui passer la valeur possédée par la variable i de type int, il ne fallait pas écrire p(i) mais p((float) i).

Il reste cependant un certain nombre de situations où l'opérateur de conversion est nécessaire. En voici un exemple. Il s'agit d'un programme qui a pour but de déterminer si l'architecture de la machine est de type little endian ou big endian. Il faut regarder l'ordre des octets dans un entier, d'où la nécessité de l'opérateur de conversion. Ce programme suppose que les int sont implémentés sur 4 octets.

int i = 0x01020304;
char *p;

p = (char *) &i;    /*   int * transformé en char *   */
if (*p++ == 1 && *p++ == 2 && *p++ == 3 && *p++ == 4 )
   printf("big endian\n");
else
   {
   p = (char *) &i;
   if (*p++ == 4 && *p++ == 3 && *p++ == 2 && *p++ == 1 )
      printf("little endian\n");
   else printf("architecture exotique !!\n");
   }
Exécuté sur une machine Sun à processeur SPARC, ce programme répondra big endian, exécuté sur un PC à processeur Intel, il répondra little endian.

Matthieu Moy 2017-02-08