这样做是否正确?
typedef unsigned int Index;
enum
{
InvalidIndex = (Index) -1
};
我已经读过它在各个平台上都不安全,但我在很多“专业”代码中都看到了这个......
答案 0 :(得分:6)
你读到的内容可能是出于恐惧,不确定和怀疑。您阅读的任何内容的作者都可能认为(unsigned)-1
正在下溢,并且可能会导致系统发生混乱,而系统中的位代表不会给您UINT_MAX
带来麻烦。
然而,作者错了,因为标准保证无符号值在到达其范围的边缘时会回绕。无论涉及哪些位表示,(unsigned)-1
都是 std::numeric_limits<unsigned>::max()
。周期。
答案 1 :(得分:4)
如果你想获得UINT_MAX,我很确定这实际上是最好的方法。将-1转换为unsigned
可确保产生UINT_MAX。它在评论中得到了解释。
答案 2 :(得分:2)
这是不安全的,因为枚举的内容没有明确定义。
有关详细信息,请参阅Are C++ enums signed or unsigned?。
在一天结束时,你所写的内容看起来最终会在翻译中成为(int)(unsigned int)(int),所以我不确定你想要完成什么。
答案 3 :(得分:-1)
不确定这是否是实现定义,但是将-1(显然已签名)转换为无符号整数会导致下溢,这通常会导致极大的值(即INT_MAX)。