这样做正确吗?
typedef unsigned int Index;
enum
{
InvalidIndex = (Index) -1
};
我读过跨平台不安全的说法,但我在许多“专业”的代码中看到了这种用法...
(unsigned)-1
会发生下溢并在某些系统上潜在地引起混乱,因为位表示法不能给你 UINT_MAX
作为补偿。(unsigned)-1
就是 std::numeric_limits<unsigned>::max()
。没有例外。enum
的底层类型,但你知道它能够保存任何枚举常量的值,否则就会在编译时出错。UINT_MAX
是一个值,这是枚举常量唯一合法的取值。 - James KanzeUINT_MAX
是一个无符号整数类型的最大值。它的保证并不是因为位表示中的有符号性质,而是因为将值转换为无符号类型会执行模算术。正好在二进制补码表示法中,这会使得位模式保持不变,但在一的补码和符号-大小表示法中,位模式会发生改变,并且强制转换确保进行这种操作。 - Steve JessopINT_MAX
,但这里实际上与之相关的是 UINT_MAX
。不是因为位数的原因,而是因为标准规定无符号值会回绕。然后当你再次将其转换为 signed
用于枚举(如果底层类型是有符号的话),你会得到 -1。 - Lightness Races in Orbit这段代码是不安全的,因为enum(枚举类型)的定义不够明确。
有关此问题的更多信息,请参见C++中的枚举类型是有符号还是无符号?。
总之,你写的代码最终会被转换为(int)(unsigned int)(int),我不确定你想要实现什么功能。
不太确定这是否是实现定义,但将-1(显然为有符号数)强制转换为无符号整数会导致下溢,通常会导致极大的值(即INT_MAX)。