たとえば
size_t x = -1u;
if (x == -1u)
...
有効?
これが有効な場合、警告が防止されます。もちろん、32 ビット システムでは x は 0xffffffff であり、64 ビット システムでは 0xffffffffffffffff である必要があります。
-ヨッヘン
たとえば
size_t x = -1u;
if (x == -1u)
...
有効?
これが有効な場合、警告が防止されます。もちろん、32 ビット システムでは x は 0xffffffff であり、64 ビット システムでは 0xffffffffffffffff である必要があります。
-ヨッヘン
1u
タイプを持っていunsigned int
ます。これは、単項演算子を使用して否定され-
ます。動作は次のとおりです。
符号なし数量の負数は、その値を 2 nから減算することによって計算されます。ここで、n はプロモートされたオペランドのビット数です (C++11 5.3.1/8)。
-1u
したがって、 によって表現可能な最大値が得られることが保証されますunsigned int
。
任意の符号なし型で表現可能な最大値を取得するには、-1
その型にキャストできます。たとえば、 についてstd::size_t
考えてみ
ましょうstatic_cast<std::size_t>(-1)
。
「符号なし、すべてのビットがオン」の目的で、常に ~0U を使用してきました。
コンパイラの実装に依存する動作は厄介です。ただし、これを行うことができるはずです:
size_t x = 0;
x--;
if ((x+1) == 0)
これは技術的には有効なコードですが、実装依存の動作に依存しています: 負の数を符号なしに変換するオーバーフロー処理。ただし、使用している API 呼び出しが size_t を必要とするために size_t と -1 を意味のある比較する必要がある場合、システムは既に台無しになっていますが、反対側でも同じことをしなければならなかったため、コードは機能する可能性があります。 APIの。
これはおそらくあなたが望むものです:
size_t x = -1ull;
if (x == -((size_t)-1ull))
...
x
すべてのビットが設定されていない可能性があるため、可能な限り最大の整数に設定されます。そのためには ~0 を使用してください。