将已签名转换为未签名

casting signed to unsigned

本文关键字:转换      更新时间:2023-10-16

这样做正确吗?

typedef unsigned int Index;
enum
{
  InvalidIndex = (Index) -1 
};

我读到过跨平台是不安全的,但我在很多"专业"代码中都看到了这一点。。。

你读到的可能是出于恐惧、不确定性和怀疑。无论你读到什么,作者都可能认为(unsigned)-1是下溢的,并可能在系统上造成混乱,因为比特表示不会为你的麻烦提供UINT_MAX

然而,作者错了,因为标准保证无符号值在到达其范围的边缘时会换行。无论涉及什么比特表示,(unsigned)-1都是std::numeric_limits<unsigned>::max()。时期

不过,我不确定它在这里有什么好处。你会得到一个很大的、最大的值。。如果可以的话,我想你可以去了。

如果你想获得UINT_MAX,我敢肯定这实际上是最好的方法。将-1转换为unsigned保证会产生UINT_MAX。评论中对此进行了解释。

这是不安全的,因为枚举没有明确定义。

请参阅C++枚举是有符号的还是无符号的?了解更多信息。

一天下来,你写的东西在翻译中看起来像是(int)(unsigned int)(int),所以我不确定你想完成什么。

不太确定这是否是实现定义的,但将-1(显然是有符号的)强制转换为无符号整数会导致下溢,这通常会导致非常大的值(即INT_MAX)。