short
非常に基本的な質問: C++でリテラルを記述するにはどうすればよいですか?
私は次のことを知っています:
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 標準の作成者でさえ、これに巻き込まれました。これは、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."
*/
疑似コンストラクター構文を使用することもできます。
short(2)
キャストよりも読みやすいと思います。
私の知る限り、そのような接尾辞はありません。ただし、ほとんどのコンパイラは、整数リテラルが大きすぎて格納しようとしている変数に収まらない場合に警告します。