Maison > développement back-end > C++ > `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
Libérer: 2024-10-26 04:22:31
original
622 Les gens l'ont consulté

  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>
Copier après la connexion

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>
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal