2008-10-16 14 views
93

Pregunta muy básica: ¿cómo escribo un literal short en C++?¿Cómo escribo un breve literal en C++?

que saber lo siguiente:

  • 2 es un int
  • 2U es un unsigned int
  • 2L es una long
  • 2LL es una long long
  • 2.0f es una float
  • 2.0 es una double
  • '\2' es una char.

Pero, ¿cómo podría escribir un literal short? Intenté 2S pero eso da una advertencia del compilador.

+7

Supongo que el literal corto no se admite únicamente debido al hecho de que cualquier cosa inferior a int se "promocionará" a int durante la evaluación. int tiene el tamaño más natural. Esto se llama promoción de enteros en C++. – user534498

Respuesta

66
((short)2) 

Sí, no es estrictamente un corto literal, más de un int-fundido, pero el comportamiento es el mismo y creo que no es una forma directa de hacerlo.

Eso es lo que he estado haciendo porque no pude encontrar nada al respecto. Supongo que el compilador sería lo suficientemente inteligente como para compilar esto como si fuera un breve literal (es decir, no asignaría realmente un int y luego lo lanzaría cada vez).

A continuación se ilustra la cantidad que debe preocuparse por esto:

a = 2L; 
b = 2.0; 
c = (short)2; 
d = '\2'; 

Compilar -> desmonte ->

movl $2, _a 
movl $2, _b 
movl $2, _c 
movl $2, _d 
+0

Eso es lo que he estado haciendo porque no pude encontrar nada al respecto. Supongo que el compilador sería lo suficientemente inteligente como para compilar esto como si fuera un breve literal (es decir, no asignaría realmente un int y luego lo lanzaría cada vez). – Kip

+0

El "elenco" no está realmente haciendo nada. No hay instrucción ensamblador "moldeada" cuando estamos hablando de C o C++ (sin embargo, .NET MSIL es una historia diferente). Ahí en el metal, todo son solo dígitos binarios –

+9

¿Cuáles son los tipos de a, b, cyd anteriores? –

5

Por lo que sé, no es así, no hay tal sufijo. La mayoría de los compiladores advertirán si un literal entero es demasiado grande para caber en cualquier variable en la que intente almacenarlo.

27

Incluso los escritores de la norma C99 quedó atrapado por esto. Este es un fragmento de dominio público aplicación stdint.h de Danny Smith:

/* 7.18.4.1 Macros for minimum-width integer constants 

    Accoding to Douglas Gwyn <[email protected]>: 
    "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC 
    9899:1999 as initially published, the expansion was required 
    to be an integer constant of precisely matching type, which 
    is impossible to accomplish for the shorter types on most 
    platforms, because C99 provides no standard way to designate 
    an integer constant with width less than that of type int. 
    TC1 changed this to require just an integer constant 
    *expression* with *promoted* type." 
*/ 
41

C++ 11 te da bastante cerca de lo que desea. (Búsqueda de "literales definidos por el usuario" para obtener más información.)

#include <cstdint> 

inline std::uint16_t operator "" _u(unsigned long long value) 
{ 
    return static_cast<std::uint16_t>(value); 
} 

void func(std::uint32_t value); // 1 
void func(std::uint16_t value); // 2 

func(0x1234U); // calls 1 
func(0x1234_u); // calls 2 

// also 
inline std::int16_t operator "" _s(unsigned long long value) 
{ 
    return static_cast<std::int16_t>(value); 
} 
+3

'short' físicamente no puede ser' std :: uint' nada, ya que es un tipo firmado. Y no es necesario que sea de 16 bits o del mismo tipo que un 'std :: int16_t' ... que ni siquiera es necesario que _exist_ en una implementación dada si la plataforma no puede suministrar el tipo de ancho exacto. La idea central de esta respuesta es buena, pero está devaluada por la inexplicable tangente en tipos no relacionados que el OP no preguntó. –

+0

Tenga en cuenta que los literales definidos por el usuario no son compatibles con Visual Studio hasta VS2015: https://msdn.microsoft.com/en-us/library/hh567368(v=vs.140).aspx – parsley72

6

También puede utilizar la sintaxis seudo constructor.

short(2) 

Encuentro más legible que el casting.

+1

se llama una "expresión de molde funcional" . También me gusta mucho, especialmente al programar con la API de Windows. –

12

Si utiliza Microsoft Visual C++, hay sufijos literales disponibles para cada tipo entero:

auto var1 = 10i8; // char 
auto var2 = 10ui8; // unsigned char 

auto var3 = 10i16; // short 
auto var4 = 10ui16; // unsigned short 

auto var5 = 10i32; // int 
auto var6 = 10ui32; // unsigned int 

auto var7 = 10i64; // long long 
auto var8 = 10ui64; // unsigned long long 

cuenta que estos son extensiones no estándar y no son portátiles. De hecho, ni siquiera pude encontrar información sobre estos sufijos en MSDN.

+1

Cuando rastrea uno de los sufijos, verá que, por ejemplo, '" "ui8' se define como' '\ 000'', que es esencialmente '' \ 0''. – Nikita

Cuestiones relacionadas