propio personal hacer exitoso crear como c++ types

c++ - personal - ¿Cómo escribir un literal int corto sin signo?



como crear un hashtag propio en instagram (8)

Desafortunadamente, el único método definido para esto es

Uno o dos caracteres en comillas simples (''), precedidos por la letra L

De acuerdo con http://cpp.comsci.us/etymology/literals.html

Lo que significa que tendrías que representar tu número como una secuencia de escape ASCII:

unsigned short bar = L''/x17'';

42 como unsigned int está bien definido como "42U".

unsigned int foo = 42U; // yeah!

¿Cómo puedo escribir "23" para que quede claro que es un int corto sin signo?

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

EDIT para que el significado de la pregunta sea más claro:

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; }


Desafortunadamente, no pueden. Pero si la gente solo mira dos palabras detrás del número, deberían ver claramente que es corto ... No es TAN ambiguo. Pero sería lindo.


No hay modificadores para corto sin firmar. Los enteros, que tienen el tipo int por defecto, por lo general se convierten implícitamente al tipo de destino sin problemas. Pero si realmente desea indicar explícitamente el tipo, podría escribir lo siguiente:

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

Como puedo ver, la única razón es usar dicha indicación para el tipo de plantilla de deducción adecuada:

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

Pero para ese caso más claro sería llamar así:

func<unsigned short>( 23 );


No puedes. Los literales numéricos no pueden tener unsigned short tipo unsigned short short o unsigned short .

Por supuesto, para asignar a la bar , el valor del literal se convierte implícitamente a unsigned short . En su primer código de muestra, puede hacer que la conversión sea explícita con un molde, pero creo que ya es bastante obvio qué conversión tendrá lugar. La conversión es potencialmente peor, ya que con algunos compiladores retendrá las advertencias que se emitirían si el valor literal está fuera del rango de un unsigned short . Por otra parte, si desea utilizar dicho valor por una buena razón, entonces reprimir las advertencias es bueno.

En el ejemplo de su edición, donde resulta ser una función de plantilla en lugar de una función sobrecargada, tiene una alternativa a un molde: do_something<unsigned short>(23) . Con una función sobrecargada, aún podrías evitar un lanzamiento con:

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

... pero no lo aconsejo. Si nada más, esto solo funciona si la versión unsigned short realmente existe, mientras que una llamada con el reparto realiza la resolución de sobrecarga habitual para encontrar la versión más compatible disponible.


Probablemente no deberías usar short, a menos que tengas muchos de ellos. Está pensado para usar menos almacenamiento que un int, pero ese int tendrá el "tamaño natural" para la arquitectura. Lógicamente se deduce que un corto probablemente no. Al igual que en los campos de bit, esto significa que los pantalones cortos se pueden considerar una compensación de espacio / tiempo. Por lo general, solo vale la pena si te compra un montón de espacio. Sin embargo, es poco probable que tenga muchos literales en la aplicación, por lo que no era necesario contar con literales cortos. Los casos de uso simplemente no se superponen.


Si expresa la cantidad como un número hexadecimal de 4 dígitos, la brevedad sin signo podría ser más clara.

unsigned short bar = 0x0017;


al menos en Visual Studio (al menos 2013 y más reciente) puede escribir

23ui16

para obtener una constante de tipo unsigned short.

ver definiciones de macros INT8_MIN, INT8_MAX, INT16_MIN, INT16_MAX, etc. en stdint.h

No sé por el momento si esto es parte del estándar C / C ++


unsigned short bar = (unsigned short) 23;

o en nuevo habla ...

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