-1u在c++中有效吗?

Is -1u valid c++?

本文关键字:有效 c++ -1u      更新时间:2023-10-16

例如

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

有效吗?

如果这是有效的,它将阻止警告。当然,在32位系统上x应该是0xffffffff,而在64位系统上系统应该是0xffffffffffffffff。

jochen

1u的类型为unsigned int。然后使用一元-运算符将其取反。行为如下:

无符号数的负数是通过2n减去它的值来计算的,其中n是提升操作数(c++ 11 5.3.1/8)的位数。

因此,

-1u保证为您提供unsigned int所能表示的最大值。

要获得任意unsigned类型所能表示的最大值,可以将-1强制转换为该类型。例如,对于std::size_t,考虑static_cast<std::size_t>(-1) .

我一直使用~0U来表示"unsigned, all bits on"。

依赖于编译器实现的行为很烦人。不过,您应该能够这样做:

size_t x = 0;
x--;
if ((x+1) == 0)

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

这可能是您想要的:

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

x将被设置为可能的最大整数,它可能不是全部位。