web-dev-qa-db-fra.com

Comment spécifier un littéral entier de type char non signé en C++?

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);
35
WilliamKF

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.

27
Michael Burr

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
}
34
user4832129

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.

18
janm

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

9
Mr Lister

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);
7
E.M.

Simplement const unsigned char example = 0; ira bien.

4
Kyle Lutz

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.

0
Clive

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.

0
Axel Gneiting

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.

0
user261840