133

short非常に基本的な質問: C++でリテラルを記述するにはどうすればよいですか?

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

  • 2ですint
  • 2Uですunsigned int
  • 2Lですlong
  • 2LLですlong long
  • 2.0fですfloat
  • 2.0ですdouble
  • '\2'ですchar

しかし、どのようにshortリテラルを書くのでしょうか? 試し2Sましたが、コンパイラの警告が表示されます。

4

7 に答える 7

92
((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
于 2008-10-16T13:01:35.547 に答える
54

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);
}
于 2012-08-28T03:12:14.887 に答える
33

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."
*/
于 2008-10-16T16:25:35.260 に答える
13

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

short(2)

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

于 2015-04-19T21:05:59.953 に答える
8

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

于 2008-10-16T13:00:41.197 に答える