Je peux spécifier un littéral entier de type unsigned long comme suit:
const unsigned long example = 9UL;
Comment puis-je faire de même pour un personnage non signé?
const unsigned char example = 9U?;
Ceci est nécessaire pour éviter les avertissements du compilateur:
unsigned char example2 = 0;
...
min(9U?, example2);
J'espère éviter la solution de contournement prolixe dont je dispose actuellement et que le caractère 'unsigned char' n'apparaisse pas dans la ligne appelant min sans déclarer 9 dans une variable distincte:
min(static_cast<unsigned char>(9), example2);
C ne fournit aucun moyen standard de désigner une constante entière avec une largeur inférieure à celle de type int
.
Cependant, stdint.h
fournit la macro UINT8_C()
qui vous permet de faire quelque chose d'aussi proche de ce que vous cherchez, comme vous le ferez en C.
Mais la plupart des gens utilisent simplement soit pas de suffixe (pour obtenir une constante int
), soit un suffixe U
(pour obtenir une constante unsigned int
). Ils fonctionnent bien pour les valeurs de la taille d'un caractère, et c'est à peu près tout ce que vous obtenez de la macro stdint.h
de toute façon.
C++ 11 a introduit les littéraux définis par l'utilisateur. Il peut être utilisé comme ceci:
inline constexpr unsigned char operator "" _uchar( unsigned long long arg ) noexcept
{
return static_cast< unsigned char >( arg );
}
unsigned char answer()
{
return 42;
}
int main()
{
std::cout << std::min( 42, answer() ); // Compile time error!
std::cout << std::min( 42_uchar, answer() ); // OK
}
Vous pouvez lancer la constante. Par exemple:
min(static_cast<unsigned char>(9), example2);
Vous pouvez également utiliser la syntaxe du constructeur:
typedef unsigned char uchar;
min(uchar(9), example2);
Le typedef n'est pas obligatoire sur tous les compilateurs.
Si vous utilisez Visual C++ et que vous n'avez pas besoin d'interopérabilité entre les compilateurs, vous pouvez utiliser le suffixe ui8 sur un nombre pour en faire une constante de 8 bits non signée.
min(9ui8, example2);
Vous ne pouvez pas faire cela avec des constantes de caractères telles que '9'.
En supposant que vous utilisez std::min
, vous devez spécifier explicitement le type que min
doit utiliser en tant que tel.
unsigned char example2 = 0;
min<unsigned char>(9, example2);
Simplement const unsigned char example = 0;
ira bien.
La question était de savoir comment "spécifier un entier" littéral "de type char non signé en C++?". Pas comment déclarer un identifiant.
Vous utilisez la barre oblique inverse d'échappement et les chiffres octaux dans les apostrophes. (par exemple, '\ 177')
La valeur octale est toujours considérée comme non signée.
Je suppose que '\0'
serait un caractère littéral avec la valeur 0, mais je ne vois pas l'intérêt non plus.
Il n'y a pas de suffixe pour les types de caractères non signés. Les constantes entières sont soit int
ou long
(signed
ou unsigned
) et en C99 long long
. Vous pouvez utiliser le suffixe 'U' simple sans crainte tant que la valeur se situe dans la plage valide des caractères non signés.