得到一个负数(-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
}
Run Code Online (Sandbox Code Playgroud)
为什么以下正确报告REASON9并REASON17基于负数?
var reason = -2147483392;
ReasonEnum strReason = (ReasonEnum)reason;
Console.WriteLine(strReason);
Run Code Online (Sandbox Code Playgroud)
.NET小提琴在这里
我说的正确,因为这是从一个COM组件被解雇事件的原因属性,当投为enum值,这是正确的在它转换到(按该事件)的值.标志枚举是根据COM对象的SDK文档.COM对象是第三方,我无法控制数字,基于接口,它将始终作为INT提供
最顶部的位设置(在您的情况下为第31位Int32)表示负数(有关详细信息,请参阅两个补码):
int reason = -2147483392;
string bits = Convert.ToString(reason, 2).PadLeft(32, '0');
Console.Write(bits);
Run Code Online (Sandbox Code Playgroud)
结果:
10000000000000000000000100000000
^ ^
| 8-th
31-th
Run Code Online (Sandbox Code Playgroud)
所以你有
-2147483392 == (1 << 31) | (1 << 8) == REASON17 | REASON9
Run Code Online (Sandbox Code Playgroud)