23 votes

Comment écrire un unsigned short int littérale?

42 comme unsigned int est bien défini comme "42U".

unsigned int foo = 42U; // yeah!

Comment puis-je écrire "23" de sorte qu'il est clair qu'il est un unsigned short int?

unsigned short bar = 23; // booh! not clear!


MODIFIER de sorte que le sens de la question est plus claire:

template <class T>
void doSomething(T) {
    std::cout << "unknown type" << std::endl;
}

template<>
void doSomething(unsigned int) {
    std::cout << "unsigned int" << std::endl;
}

template<>
void doSomething(unsigned short) {
    std::cout << "unsigned short" << std::endl;
}

int main(int argc, char* argv[])
{
    doSomething(42U);
    doSomething((unsigned short)23); // no other option than a cast?

    return EXIT_SUCCESS;
}

25voto

Steve Jessop Points 166970

Vous ne pouvez pas. Les littéraux numériques ne peuvent pas avoir short ou unsigned short type.

Bien sûr, afin d'attribuer à bar, la valeur de la traduction littérale est implicitement converti en unsigned short. Dans votre premier exemple de code, vous pourriez faire une conversion explicite avec un plâtre, mais je pense que c'est assez évident déjà que la conversion aura lieu. Le Casting est potentiellement pire, car avec certains compilateurs, il va étouffer toutes les mises en garde qui seraient émises si la valeur littérale est en dehors de la plage de l' unsigned short. Et puis, si vous souhaitez utiliser cette valeur pour une bonne raison, alors réprimer les avertissements qui est bon.

Dans l'exemple de l'édition, où il arrive à faire une fonction de modèle plutôt que d'une fonction surchargée, vous avez une alternative à un exprimés: do_something<unsigned short>(23). Avec une fonction surchargée, vous pouvez toujours éviter une fonte avec:

void (*f)(unsigned short) = &do_something;
f(23);

... mais je ne le conseille pas. Si rien d'autre, cela ne fonctionne que si l' unsigned short version existe réellement, alors qu'un appel avec la fonte effectue l'habitude de résolution de surcharge de trouver le plus compatible avec la version disponible.

5voto

AnthonyLambert Points 4884
unsigned short bar = (unsigned short) 23;

ou dans de nouvelles parler....

unsigned short bar = static_cast<unsigned short>(23);

1voto

Kirill V. Lyadvinsky Points 47627

Il n'y a pas de modificateurs pour les unsigned short. Entiers, qui a int type par défaut, généralement implicitement converti en type de cible avec pas de problèmes. Mais si vous voulez vraiment pour indiquer explicitement le type, vous pouvez écrire le code suivant:

unsigned short bar = static_cast<unsigned short>(23);

Comme je peux voir, la seule raison est d'utiliser une telle indication pour une bonne déduire type de modèle:

func( static_cast<unsigned short>(23) );

Mais pour qu'un tel cas de plus en plus clair serait appel comme celui-ci:

func<unsigned short>( 23 );

0voto

Tyler McHenry Points 35551

Malheureusement, la seule définition de la méthode pour cela est

Un ou deux caractères entre guillemets simples ('), précédé par la lettre L

Selon http://cpp.comsci.us/etymology/literals.html

Ce qui signifie que vous auriez à représenter votre numéro ASCII séquence d'échappement:

unsigned short bar = L'\x17';

0voto

micmoo Points 3387

Malheureusement, ils ne peuvent pas. Mais si les gens il suffit de regarder deux mots derrière le nombre, ils devraient clairement voir qu'il est à une courte distance... Il n'est pas ambigu. Mais il serait agréable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X