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é.
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