非常に基本的な質問: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 <[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."
*/
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)
キャストよりも読みやすいと思います。
私の知る限り、そういう接尾辞はありません。ただし、ほとんどのコンパイラは、整数リテラルが大きすぎて格納しようとしている変数に収まらない場合は警告を出します。