Maison >développement back-end >C++ >`char`, `signed char` et `unsigned char` sont-ils vraiment distincts en 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
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!