枚举标志负值

时间:2018-09-16 21:49:53

标签: c#

得到一个负数的数字(-2147483392

我不明白为什么为什么(正确)将其强制转换为标志enum

给予

[Flags]
public enum ReasonEnum
{
    REASON1 = 1 << 0,
    REASON2 = 1 << 1,
    REASON3 = 1 << 2,
    //etc more flags
    //But the ones that matter for this are
    REASON9 =  1 << 8,
    REASON17 = 1 << 31  
}

为什么以下内容基于负数正确报告REASON9REASON17

var reason = -2147483392;
ReasonEnum strReason = (ReasonEnum)reason;
Console.WriteLine(strReason);

.NET小提琴here

我说的是正确的,因为这是从COM组件触发的事件原因属性,当转换为enum值时,它是正确的它强制转换为的值(根据该事件)。标志枚举是根据COM对象的SDK文档进行的。 COM对象是第三方,我无法控制该数字,基于接口,它将始终以INT的形式提供

1 个答案:

答案 0 :(得分:6)

最高位集(在您的Int32中为 31th )表示负数(有关详细信息,请参见two's complement):< / p>

  int reason = -2147483392;

  string bits = Convert.ToString(reason, 2).PadLeft(32, '0');

  Console.Write(bits);

结果:

  10000000000000000000000100000000
  ^                      ^
  |                      8-th
  31-th

所以你有

  -2147483392 == (1 << 31) | (1 << 8) == REASON17 | REASON9