質問

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

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

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

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

役に立ちましたか?

解決

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

他のヒント

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

C99規格のライターでさえ、これに巻き込まれました。これは、ダニースミスのパブリックドメイン 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 ++を使用している場合、すべての整数型で使用可能なリテラルサフィックスがあります。

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

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

short(2)

キャストより読みやすい。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top