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