5

编译但不应该

[Flags]
enum TransactionData : long  // 64 bits.  Last bit is sign bit, but I'm putting data there
{
    None = 0,
    Color1 = 1 << 63,
}

错误但不应该

[Flags]
enum TransactionData : ulong  // 64 bits. No sign bit.  Not allowed to put data there
{
    None = 0,
    Color1 = 1 << 63,
}

编译器错误文本:

-2147483648 无法转换为 ulong

问题:

我预计会发生相反的情况。谁能解释这是为什么?

另外,我如何将此标志属性打印到 abyte[]以供检查?

 var eee  = TransactionData.None | TransactionData.Color1
 // How do I convert eee to byte[]?
4

1 回答 1

13

请注意,这1 << 63不是 aulong甚至不是long. 编译器将其解释为int. 观察以下示例:

enum TransactionData : long
{
    None = 0,
    Color1 = 1 << 31,
    Color2 = 1 << 63,
}

Console.WriteLine(TransactionData.Color1 == TransactionData.Color2); // True

ulong但是,您可以通过在末尾添加以下内容来强制编译器将其解释为 a ul

enum TransactionData : ulong
{
    None = 0,
    Color1 = 1ul << 63,
}

尽管许多人更喜欢使用大写字母L,因为小写字母l看起来很像数字1。可以在此处找到编译器支持的后缀的完整列表。

另外,我应该指出它1ul << 63实际上是64位宽(它是一位,移动了 63 位)。

于 2014-03-12T22:50:49.460 回答