Pergunta

Uma pergunta muito básica: como faço para escrever um literal short em C ++

Eu sei o seguinte:

  • 2 é um int
  • 2U é um unsigned int
  • 2L é um long
  • 2LL é um long long
  • 2.0f é um float
  • 2.0 é um double
  • '\2' é um char.

Mas como eu ia escrever uma literal short? Tentei 2S mas que dá um aviso do compilador.

Foi útil?

Solução

((short)2)

Sim, não é estritamente uma curta literal, mais de um-int fundido, mas o comportamento é o mesmo e eu acho que não há uma maneira direta de fazê-lo.

Isso é o que eu venho fazendo, porque eu não consegui encontrar nada sobre isso. Eu acho que o compilador seria inteligente o suficiente para compilar este como se fosse uma pequena literal (ou seja, não seria realmente atribuir um int e depois lançá-lo cada vez).

A seguir ilustra o quanto você deve se preocupar com isso:

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

Compilar -> desmonte ->

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

Outras dicas

C ++ 11 dá-lhe muito perto do que você quer. (procure por "literais definidos pelo usuário" para saber mais.)

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

Mesmo os escritores do padrão C99 foi pego por este. Este é um trecho de implementação stdint.h dominio público de Danny Smith:

/* 7.18.4.1  Macros for minimum-width integer constants

    Accoding to Douglas Gwyn <gwyn@arl.mil>:
    "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."
*/

Se você usar o Microsoft Visual C ++, existem sufixos literais disponíveis para cada tipo inteiro:

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

Note que estas são extensões não-padrão e não são portáteis . Na verdade, eu não poderia mesmo encontrar alguma informação sobre estes sufixos no MSDN.

Você também pode usar pseudo sintaxe do construtor.

short(2)

Acho que é mais legível do que casting.

Tanto quanto eu sei, você não fizer isso, não há tal sufixo. A maioria dos compiladores irá avisar se um literal inteiro é muito grande para caber em qualquer variável que você está tentando para armazená-lo, no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top