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

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

我知道如下:

  • 2int
  • 2Uunsigned int
  • 2Llong
  • 2LLlong long
  • 2.0ffloat
  • 2.0double
  • '\2'char

但是我该如何编写一个 short文本呢? 我试过 2S,但是它会给编译器一个警告。

69139 次浏览

据我所知,你没有,没有这样的后缀。但是,大多数编译器会警告,如果整数文字太大,无法放入您试图存储它的任何变量中。

((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

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

C + + 11让你非常接近你想要的

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

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

short(2)

我觉得这比选角更容易理解。

如果使用 Microsoft Visual C + + ,每种整数类型都有可用的字面后缀:

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 上找到这些后缀的任何信息。

一种可能性是使用 C + + 11“列表初始化”,例如:

short{42};

这种解决方案的优点(与当前接受的答案中的强制转换相比)是它不允许缩小转换:

auto number1 = short(100000); // Oops: Stores -31072, you may get a warning
auto number2 = short{100000}; // Compiler error. Value too large for type short

使用 list-init 进行禁止的窄化转换,请参见 https://en.cppreference.com/w/cpp/language/list_initialization#Narrowing_conversions