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

时间:2008-10-16 12:57:34

标签: c++ literals

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

我知道以下内容:

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

但我怎么写一个short字面值?我尝试了2S,但这给出了编译器警告。

7 个答案:

答案 0 :(得分:75)

((short)2)

是的,它不是严格意义上的短文字,更像是一个casted-int,但行为是相同的,我认为没有直接的方法。

  

这就是我一直在做的事情,因为我找不到任何关于它的东西。我猜想编译器会很聪明地编译它,好像它是一个短文字(即它实际上不会分配一个int然后每次都抛出它)。

以下说明您应该担心多少:

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

编译 - >反汇编 - >

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

答案 1 :(得分:48)

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

答案 2 :(得分:27)

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

答案 3 :(得分:13)

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

答案 4 :(得分:9)

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

short(2)

我发现它比投射更具可读性。

答案 5 :(得分:6)

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

$ npm install

此解决方案的优势(与当前接受的答案中的强制类型转换相比)是它不允许缩小转换范围:

short{42};

有关禁止使用list-init进行缩小转换的信息,请参见https://en.cppreference.com/w/cpp/language/list_initialization#Narrowing_conversions

答案 6 :(得分:5)

据我所知,你没有,没有这样的后缀。但是,如果整数文字太大而无法容纳您尝试存储的任何变量,大多数编译器都会发出警告。