此问题基于:
Shift with 64 bit int
问题的起源是 - 我定义了一个enum
,它提供了不同的面具。
并且需要在将结果右移之后使&
(掩码)变量enum
。
由于enum
类型始终为int
,因此该变量也被定义为int
。但正如您所看到的那样,右移负数存在问题。
可以做些什么来解决这个问题?
答案 0 :(得分:4)
首先,enum
类型并不总是int
;在C ++ 11中,你可以
甚至强迫它成为无符号类型。第二,即使是
基础类型是int
,您可以(并且应该)自由地转换为
来自unsigned
并没有真正的风险。例如,您可以超载
operator&
因此:
MyEnum
operator&( MyEnum lhs, MyEnum rhs )
{
return static_cast<MyEnum>(
static_cast<unsigned>( lhs) & static_cast<unsigned>( rhs ) );
}
用于提取可能位于某处的字段:
int
getFieldX( MyEnum values )
{
return static_cast<unsigned>(values & fieldXMask) >> fieldXOffset;
}
这将确保正确的行为(以及无符号值
已被转移,它应该转换为int
而不会丢失
值)。
答案 1 :(得分:1)
我建议你在移位之前将枚举值静态转换为unsigned long long
。我认为这是你可以使用的最安全的选择。
答案 2 :(得分:0)
你可以先进行转换,然后对着移动的掩码进行AND,以解决这个问题。