为什么选择整数十六进制为枚举

时间:2014-08-21 23:43:34

标签: c# enums

在阅读MongoDB驱动程序代码时。我注意到一个枚举,其所有值都是十六进制。我之前见过这个,但从未问过自己为什么十六进制是最好的选择。现在我正在努力进一步了解自己并理解这段代码以及MongoDB进入hhexadecimal路由而不是整数的原因。任何帮助将不胜感激。

以下是我所指的代码:

https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Bson/ObjectModel/BsonType.cs

代码段:

namespace MongoDB.Bson
{
    [Serializable]
    public enum BsonType
    {
        EndOfDocument = 0x00,
        Double = 0x01,
        String = 0x02,
        Document = 0x03,
        Array = 0x04,
        Binary = 0x05,
        Undefined = 0x06,
        ObjectId = 0x07,
        Boolean = 0x08,
        DateTime = 0x09,
        Null = 0x0a,
        RegularExpression = 0x0b,
        JavaScript = 0x0d,
        Symbol = 0x0e,
        JavaScriptWithScope = 0x0f,
        Int32 = 0x10,
        Timestamp = 0x11,
        Int64 = 0x12,
        MinKey = 0xff,
        MaxKey = 0x7f
    }
}

2 个答案:

答案 0 :(得分:1)

在一般情况下,如果

,则十六进制枚举常量是合理的
  • 它们代表标志位或
  • 如果有其他来源的(十六进制)文档来源或
  • 如果有一些(十六进制)输出或记录工具,它们将被显示在其中。

除非其中一个是真的,否则他们通常是一个坏主意,往往是一个非常糟糕的主意。我不熟悉Mongo源代码,但我认为这里给出的片段没有任何理由。

最可能的原因是程序员的习惯。有些人似乎只是用十六进制思考。我们大多数人都尽力不去。

答案 1 :(得分:-1)

十六进制系统可以用与十进制相同的方式表示负数:-2A表示-4210。

但是,我们更喜欢使用十六进制表示法来表示处理器中使用的确切位模式,因此十六进制数字序列可以表示有符号甚至是浮点值。这样,负数-4210可以在32位CPU寄存器(二进制补码)中写为FFFF FFD6,如32位FPU寄存器中的C228 0000或64位FPU寄存器中的C045 0000 0000 0000 (在IEEE浮点标准中)