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

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

Je connais 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 caractère.

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

 ((short)2) 

Ouais, ce n’est pas ssortingctement un littéral court, plus un casted-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 j’ai fait parce que je n’ai rien trouvé à ce sujet. J’imagine que le compilateur serait assez intelligent pour comstackr cela comme s’il s’agissait d’un littéral court (c’est-à-dire qu’il n’allouerait pas un int et le lancerait à chaque fois).

Ce qui suit illustre à quel point vous devez vous inquiéter:

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

Comstackr -> démonter ->

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

C ++ 11 vous permet de vous rapprocher de ce que vous voulez. (Recherchez “littéraux définis par l’utilisateur” pour en savoir plus.)

 #include  inline std::uint16_t operator "" _u(unsigned long long value) { return static_cast(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(value); } 

Même les rédacteurs de la norme C99 ont été surpris par cela. Ceci est un extrait de l’implémentation stdint.h domaine public de Danny Smith:

 /* 7.18.4.1 Macros for minimum-width integer constants Accoding to Douglas Gwyn : "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." */ 

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 des extensions non standard et ne sont pas portables . En fait, je ne pouvais même pas trouver d’informations sur ces suffixes sur MSDN.

Vous pouvez également utiliser la syntaxe de pseudo constructeur.

 short(2) 

Je le trouve plus lisible que le casting.

Pour autant que je sache, vous n’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 que vous essayez de stocker.