Comprendre le type char et ses variantes

Le langage C++ hérite du langage C une contrainte auto imposée : ne faire payer aux programmeuses et aux programmeurs que le prix (en temps et en espace) qu'elles et ils ont explicitement accepté de payer. Cela a une incidence sur la conception de ce qu'est une bonne représentation interne pour les types voués (entre autres) à la représentation des caractères.

En ce sens, C++ diffère philosophiquement de Java et des langages .NET. En effet, Java et les langages .NET ont choisi de fixer le sens et la représentaiton interne des types caractères : les types char (plateforme Java; classe immutable correspondante : Character) et System.Char (plateforme .NET, dont un trouve un alias nommé char en C#) ont un sens ent une représentation interne fixés par la norme de leurs plateformes respectives (entier non signé sur 16 bits destiné à rperésenter un caractère Unicode).

Le langage C++ offre aussi un type spécialement pensé pour représenter des caractères Unicode, mais il s'agit du type wchar_t, le « w » signifiant Wide (prendre au sens de caractère étendu) plutôt que du type char. Historiquement, en langage C, le type char a joué un double rôle :

Puisque le type char joue en C et en C++ le rôle traditionnel de type entier de taille 1, donc de représentation pour la plus petite unité adressable directement à l'aide d'un type du langage, il est crucial que les accès aux données de ce type soient des plus efficaces.

C'est pourquoi le type char est différent de tous les autres types entiers :

Quelques exemples :

int main()
{
   char c = 'A';
   signed char sc;
   unsigned char uc;
   sc = c; // Ok
   uc = c; // Ok
   uc = 255;
   sc = uc; // Ok; sc vaut -1
   c = uc;  // Ok; c vaut -1 ou 255 selon la plateforme
   char *s = "Coucou";
   signed char *scs;
   unsigned char *ucs;
   // scs = s; // illégal
   scs = reinterpret_cast<signed char*>(s);   // Ok
   // ucs = s; // illégal
   ucs = reinterpret_cast<unsigned char*>(s); // Ok
}

Valid XHTML 1.0 Transitional

CSS Valide !