转换签名为unsigned

时间:2011-05-31 17:55:04

标签: c++ unsigned

这样做是否正确?

typedef unsigned int Index;

enum
{
  InvalidIndex = (Index) -1 
};

我已经读过它在各个平台上都不安全,但我在很多“专业”代码中都看到了这个......

4 个答案:

答案 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)。