C# FlagsAttribute枚举问题

C# FlagsAttribute枚举问题,c#,.net,enum-flags,C#,.net,Enum Flags,因此,我正在构建一个MSNP(windows live messenger)客户端。我有一份能力清单 public enum UserCapabilities : long { None = 0, MobileOnline = 1 << 0, MSN8User = 1 << 1, RendersGif = 1 << 2, .... MsgrVersion7 = 1 << 30, MsgrVer

因此,我正在构建一个MSNP(windows live messenger)客户端。我有一份能力清单

public enum UserCapabilities : long
{
    None = 0,
    MobileOnline = 1 << 0,
    MSN8User = 1 << 1,
    RendersGif = 1 << 2,
    ....
    MsgrVersion7 = 1 << 30,
    MsgrVersion8 = 1 << 31,
    MsgrVersion9 = 1 << 32,
}
capabilities = Int64.Parse(e.Command.Args[3]);
user._capabilities = (UserCapabilities)capabilities;
这很好,至少有一个用户(能力值为1879474220),我就可以做到

Debug.WriteLine(_msgr.GetUser(usr).Capabilities);
这将输出

RendersGif, RendersIsf, SupportsChunking, IsBot, SupportsSChannel, SupportsSipInvite, MsgrVersion5, MsgrVersion6, MsgrVersion7
但是对于另一个用户,其能力值为(3055849760),当我做同样的操作时,只会输出相同的数字

3055849760
我希望看到的是一个功能列表,就像其他用户一样

我相信发生这种情况有一个非常合理的原因,但无论我如何努力地向谷歌提出这个问题,我都找不到答案


请帮助我:)

问题可能是算术溢出

特别是:

MsgrVersion8 = 1 << 31,
MsgrVersion9 = 1 << 32,

MsgrVersion8=1移位运算符的定义意味着只有5个最低有效位用于32位数字,只有前6位用于64位数字;意思是:

1 << 5

您将其设置为64位数字,这就是@leppie的修复程序起作用的原因;否则,
+1将用于回答一个问题!原因很简单:1是
Int32
,31也是
Int32
,结果也是
Int32
,这是一个有符号的int,最大值为2147483647,但1@Daniel@NoPyGod这与溢出无关;请看我的回答它可能不被称为“溢出”,但效果是一样的,即
(1L@leppie-但如果它只是为了避免溢出,那么你应该期待(对于
int
)任何

1 << 5
1 << 37
MsgrVersion9 = 1L << 32