-1u是有效的c ++吗?

时间:2011-12-05 20:54:20

标签: c++ platform-independent

例如

size_t x = -1u;

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

有效?

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

-Jochen

5 个答案:

答案 0 :(得分:7)

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

  

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

因此,

-1u可以保证为您提供unsigned int所代表的最大值。

要获取可由任意无符号类型表示的最大值,可以将-1强制转换为该类型。例如,对于std::size_t,请考虑  static_cast<std::size_t>(-1)

答案 1 :(得分:5)

我总是使用~0U来达到“无符号,所有位都开启”的目的。

答案 2 :(得分:1)

编译器实现依赖行为令人讨厌。不过你应该能够做到这一点:

size_t x = 0;
x--;

if ((x+1) == 0)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这可能是你想要的:

size_t x = -1ull;

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

x将被设置为可能的最大整数,可能不是所有位都设置。使用~0表示。