web-dev-qa-db-ja.com

C ++で短いリテラルを記述する方法

非常に基本的な質問:C++でshortリテラルを記述する方法

私は次のことを知っています:

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

しかし、どのようにshortリテラルを書くのでしょうか?私は試した 2Sしかし、それはコンパイラの警告を与えます。

110
Kip
((short)2)

ええ、それは厳密に短いリテラルではなく、キャストされたintのようなものですが、振る舞いは同じであり、それを行う直接的な方法はないと思います。

私はそれについて何も見つけられなかったので、私がやってきたことです。コンパイラは、これが短いリテラルであるかのようにこれをコンパイルするのに十分スマートであると推測します(つまり、実際にintを割り当ててから毎回キャストしません)。

以下は、これについてどれだけ心配する必要があるかを示しています。

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

コンパイル->逆アセンブル->

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

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

C99標準の作成者でさえ、これに気づかれました。これは、ダニースミスのパブリックドメインのスニペットstdint.h実装:

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

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でこれらのサフィックスに関する情報を見つけることさえできませんでした。

13
Alexander Revo

疑似コンストラクター構文も使用できます。

short(2)

キャストよりも読みやすいと思います。

9
jimvonmoon

私の知る限り、そういう接尾辞はありません。ただし、ほとんどのコンパイラは、整数リテラルが大きすぎて格納しようとしている変数に収まらない場合は警告を出します。

6
unwind