"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > « char », « signed char » et « unsigned char » sont-ils vraiment distincts en C++ ?

« char », « signed char » et « unsigned char » sont-ils vraiment distincts en C++ ?

Publié le 2024-11-05
Parcourir:207

  Are `char`, `signed char`, and `unsigned char` Truly Distinct in C  ?

Types de caractères en C : distincts ou équivalents ?

En C , le comportement des types de caractères (char) peut parfois différer de celui des entiers signés et non signés, ce qui prête à confusion. Plus précisément, le code suivant illustre cette différence :

#include 

typedef   signed char       int8;
typedef unsigned char      uint8;

struct TrueType {};
struct FalseType {};

template 
struct isX
{
   typedef typename T::ikIsX ikIsX;
};

template             struct isX  { typedef FalseType ikIsX; };
template             struct isX  { typedef FalseType ikIsX; };
template             struct isX  { typedef FalseType ikIsX; };

template  bool getIsTrue();
template            bool getIsTrue() { return true; }
template            bool getIsTrue() { return false; }

int main(int, char **t )
{
   cout ::ikIsX  >() ::ikIsX  >() ::ikIsX  >() 

Ce code compile mais produit des résultats différents pour char que pour int8 et uint8. En effet, C traite les caractères char, signé et non signé comme trois types distincts.

En revanche, int et uint32 sont des types équivalents :

template             struct isX  { typedef FalseType ikIsX; };
template             struct isX  { typedef FalseType ikIsX; };

Cette distinction découle du fait que char a été historiquement utilisé à la fois pour représenter des caractères et pour stocker des valeurs numériques. En conséquence, C maintient la compatibilité descendante en traitant plain char comme un type distinct, distinct de int.

Pour déterminer laquelle des deux représentations char utilise, le typedef char_traits::signed défini par l'implémentation est fourni. Si cela est vrai, char se comporte comme un type signé ; sinon, il se comporte comme un type non signé.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3