Maison  >  Article  >  développement back-end  >  `char`, `signed char` et `unsigned char` sont-ils vraiment distincts en C ?

`char`, `signed char` et `unsigned char` sont-ils vraiment distincts en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 04:22:31421parcourir

  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 de entiers signés et non signés, ce qui prête à confusion. Plus précisément, le code suivant démontre cette différence :

<code class="cpp">#include <iostream>

typedef   signed char       int8;
typedef unsigned char      uint8;

struct TrueType {};
struct FalseType {};

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

template <>            struct isX<char  >  { typedef FalseType ikIsX; };
template <>            struct isX<int8  >  { typedef FalseType ikIsX; };
template <>            struct isX<uint8 >  { typedef FalseType ikIsX; };

template <typename T> bool getIsTrue();
template <>           bool getIsTrue<TrueType>() { return true; }
template <>           bool getIsTrue<FalseType>() { return false; }

int main(int, char **t )
{
   cout << getIsTrue< isX<char>::ikIsX  >() << endl;
   cout << getIsTrue< isX<int8>::ikIsX  >() << endl;
   cout << getIsTrue< isX<uint8>::ikIsX  >() << endl;
}</code>

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 :

<code class="cpp">template <>            struct isX<int   >  { typedef FalseType ikIsX; };
template <>            struct isX<unit32>  { typedef FalseType ikIsX; };</code>

Cette distinction découle du fait que char a toujours été 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é.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn