web-dev-qa-db-fra.com

Comment écrire un court littéral en C ++?

Question très basique: comment écrire un littéral short en C++?

Je sais ce qui suit:

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

Mais comment pourrais-je écrire un short littéral? J'ai essayé 2S mais cela donne un avertissement au compilateur.

110
Kip
((short)2)

Ouais, ce n'est pas strictement un littéral court, plutôt un cast-int, mais le comportement est le même et je pense qu'il n'y a pas de moyen direct de le faire.

C'est ce que je fais parce que je n'ai rien trouvé à ce sujet. Je suppose que le compilateur serait assez intelligent pour compiler cela comme s'il s'agissait d'un littéral court (c'est-à-dire qu'il n'allouerait pas réellement un entier et le convertirait à chaque fois).

Ce qui suit montre à quel point vous devez vous en préoccuper:

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

Compiler -> démonter ->

movl    $2, _a
movl    $2, _b
movl    $2, _c
movl    $2, _d
79
Mike F

C++ 11 vous donne assez près de ce que vous voulez. (Recherchez les "littéraux définis par l'utilisateur" pour en savoir plus.)

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

Même les rédacteurs de la norme C99 se sont fait prendre par cela. Ceci est un extrait du domaine public de Danny Smith stdint.h la mise en oeuvre:

/* 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."
*/
28
Michael Burr

Si vous utilisez Microsoft Visual C++, des suffixes littéraux sont disponibles pour chaque type d'entier:

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

Notez que ce sont extensions non standard et ne sont pas portables. En fait, je n'ai même pas pu trouver d'informations sur ces suffixes sur MSDN.

13
Alexander Revo

Vous pouvez également utiliser la syntaxe du pseudo-constructeur.

short(2)

Je le trouve plus lisible que le casting.

9
jimvonmoon

Pour autant que je sache, vous ne l'avez pas, il n'y a pas un tel suffixe. Cependant, la plupart des compilateurs avertissent si un littéral entier est trop grand pour tenir dans la variable dans laquelle vous essayez de le stocker.

6
unwind