如何在C ++中编写简短的文字?

非常基本的问题:如何在C ++中编写short文字?

我知道以下几点:

  • 2是一个int
  • 2U是一个unsigned int
  • 2L是一个long
  • 2LLlong long
  • 2.0f是一个float
  • 2.0是一个double
  • '\2'是一个char

但是,我将如何写一个short文字? 我试过2S但给出了一个编译器的警告。

 ((short)2) 

是的,这不是一个简短的文字,更不是一个铸造的,但行为是相同的,我认为没有一个直接的方法来做到这一点。

这就是我一直在做的事情,因为我找不到任何关于它的事情。 我猜测编译器会足够聪明来编译它,就好像它是一个简短的文字(即它不会实际分配一个int然后每次都投它)。

下面说明你应该多担心这个问题:

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

编译 – >反汇编 – >

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

C ++ 11让你非常接近你想要的。 (search“用户定义文字”以了解更多信息。)

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

即使是C99标准的作者也被这个问题所困扰。 这是Danny Smith公共领域stdint.h实现的一个片段:

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

如果使用Microsoft Visual C ++,则每个整数types都有文字后缀可用:

 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 

请注意,这些是非标准的扩展名不可移植 。 实际上,我甚至无法在MSDN上find这些后缀的任何信息。

您也可以使用伪构造函数语法。

 short(2) 

我发现它比铸造更可读。

据我所知,你没有,没有这样的后缀。 不过,大多数编译器会警告,如果整数字面太大,无法放入任何你想存储的variables。