例如
size_t x = -1u;
if (x == -1u)
...
有效?
如果这是有效的,它会阻止警告。 当然在32位系统上x应该是0xffffffff而在64位上 系统应该是0xffffffffffffffffff。
-Jochen
答案 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表示。