この列挙型をヘッダー ファイルで宣言しました。
enum wildcard {
....
....
NW_SRC = 0x111UL << 40,
....
};
コンパイルすると、次の警告が表示されます。
warning: left shift count >= width of type [enabled by default]
int
これは、列挙型がコンパイラによってとして扱われるためだと思います。これを解決するにはどうすればよいですか?
2つの異なる問題があります。最初に操作、次に定数の宣言です。
操作には、で提供されているマクロを使用できますinttypes.h
UINT64_C(0x111) << 40
適切な幅の定数を持つこと。
ただし、列挙型定数は標準の定義によるものであるため、プラットフォーム上で32ビット幅しかないint
場合(非常に可能性が高い)、値を保持するのに十分な大きさの列挙型定数を定義するのに役立ちません。int
おUL
使いのプラットフォームの はおそらく 32 ビットです。ULL
代わりに次を使用する必要がある場合があります。
enum wildcard {
....
....
NW_SRC = 0x111ULL << 40,
....
};
これにより警告は修正されますが、式の結果が必ずしも一致しない場合がありますenum
(詳細と関連する標準ドキュメントへの参照については、この回答を参照してください)。
UL
unsigned long ですが、大半のコンパイラでは long は 32 ビットです。ULL
unsigned long longが必要です。
しかし、回答で Jens Gustedt が正しく指摘しているように、C では enum はとにかく int より大きい値を保持できないため、これは役に立ちません。対照的に、C++ では、列挙型をより大きな整数型で表すことができます。