同じリテラルを使用して、符号変換エラー (-Wsign-conversion) を発生させることなく、任意の幅の符号なし変数のすべてのビットを 1 に設定できますか?
-Wsign-conversion がなければ、次のことができます。
#define ALL_BITS_SET (-1)
uint32_t mask_32 = ALL_BITS_SET;
uint64_t mask_64 = ALL_BITS_SET;
uintptr_t mask_ptr = ALL_BITS_SET << 12; // here's the narrow problem!
しかし、 -Wsign-conversion では困惑しています。
error: negative integer implicitly converted to unsigned type [-Werror=sign-conversion]
(~0) と (~0U) を試しましたが、サイコロはありません。プリプロセッサは最初の変数を int に昇格させ、-Wsign-conversion をトリガーします。2 番目の変数は 32 ビットを超えて昇格せず、64 ビット変数の下位 32 ビットのみを設定します。
私は運が悪いのでしょうか?
編集: 明確にするために、プロジェクト全体の多くの場所で定義済みの ALL_BITS_SET を使用しているため、(~(uint32_t)0) や (~(uintptr_t)0) などをソースに散らかすことをためらっています。