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

虽然这在技术上是有效的代码,但您依赖于实现相关的行为:将负数转换为无符号的溢出处理。但是,如果您需要有意义地将 size_t 与 -1 进行比较,因为您正在使用的 API 调用需要它,那么系统已经搞砸了,但您的代码可能会工作,因为他们不得不在另一边做同样的事情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 回答