问题描述
这样做正确吗?
typedef unsigned int Index;
enum
{
Invalidindex = (Index) -1
};
我已经知道跨平台是不安全的,但是我已经在很多“专业”代码中看到了这一点……
解决方法
您所读的内容可能是出于恐惧,不确定性和怀疑。您所读的任何内容的作者都可能认为ѭ1正在溢出,并且在没有发生位表示的系统上给您造成ѭ2的麻烦,这可能会引起混乱。
但是,作者是错误的,因为该标准保证了无符号值在到达其范围的边缘时会回绕。无论涉及什么位表示,
(unsigned)-1
都是std::numeric_limits<unsigned>::max()
。期。
不过,我不确定它的好处是什么。您将获得那么大的最大值。如果还可以,我想您很好。
, 如果您想获得UINT_MAX,我很确定这实际上是最好的方法。将-1转换为unsigned
可以保证产生UINT_MAX。在评论中有解释。
, 这是不安全的,因为没有明确定义枚举。
请参阅C ++枚举是签名的还是未签名的?有关更多信息。
归根结底,您所写的内容最终将变成翻译中的(int)(unsigned int)(int),因此我不确定您要完成的工作。
, 不太确定这是否是实现定义的,但是将-1(显然是带符号的)强制转换为无符号的整数会导致下溢,通常会导致极大的值(即INT_MAX)。