11

たとえば

size_t x = -1u;

if (x == -1u)
    ...

有効?

これが有効な場合、警告が防止されます。もちろん、32 ビット システムでは x は 0xffffffff であり、64 ビット システムでは 0xffffffffffffffff である必要があります。

-ヨッヘン

4

5 に答える 5

8

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)

于 2011-12-05T21:21:58.370 に答える
5

「符号なし、すべてのビットがオン」の目的で、常に ~0U を使用してきました。

于 2011-12-05T21:00:57.660 に答える
1

コンパイラの実装に依存する動作は厄介です。ただし、これを行うことができるはずです:

size_t x = 0;
x--;

if ((x+1) == 0)
于 2011-12-05T21:16:38.470 に答える
0

これは技術的には有効なコードですが、実装依存の動作に依存しています: 負の数を符号なしに変換するオーバーフロー処理。ただし、使用している API 呼び出しが size_t を必要とするために size_t と -1 を意味のある比較する必要がある場合、システムは既に台無しになっていますが、反対側でも同じことをしなければならなかったため、コードは機能する可能性があります。 APIの。

于 2011-12-05T21:00:19.277 に答える
0

これはおそらくあなたが望むものです:

size_t x = -1ull;

if (x == -((size_t)-1ull))
    ...

xすべてのビットが設定されていない可能性があるため、可能な限り最大の整数に設定されます。そのためには ~0 を使用してください。

于 2011-12-05T21:21:55.377 に答える