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