【问题标题】:enum value defined in hex grows and turns into negative value以十六进制定义的枚举值增长并变成负值
【发布时间】:2021-06-21 02:16:37
【问题描述】:

我正在维护一个包含以下枚举类型定义的项目。枚举值用于 一个组合框。

  1. 为什么要像这样以十六进制定义枚举类型,以提高性能?

  2. xxxxx920P3 实际上是负值-2147483648 而 xxxxx920P2 是正值,会导致条件代码失败。下一个值将是 xxxxx920P3 的两倍,那么这个枚举定义规则有什么替代解决方案吗?谢谢。

  3. 这是一个 QT c++ 项目。我可以将枚举类型定义为 ULONGLONG 吗?

        enum Version
         {
             xxxxx        = 0x00000000,
             xxxxx400     = 0x00000001,
             xxxxx401     = 0x00000002,
             xxxxx410     = 0x00000004,
             xxxxx411     = 0x00000008,
             xxxxx412     = 0x00000010,
             xxxxx420     = 0x00000020,
             xxxxx430     = 0x00000040,
             xxxxx431     = 0x00000080,
             xxxxx432     = 0x00000100,
             xxxxx440     = 0x00000200,
             xxxxx500     = 0x00000400,
             xxxxx510     = 0x00000800,
             xxxxx520     = 0x00001000,
             xxxxx521     = 0x00002000,
             xxxxx600     = 0x00004000,
             xxxxx611     = 0x00008000,
             xxxxx620     = 0x00010000,
             xxxxx621     = 0x00020000,
             xxxxx700     = 0x00040000,
             xxxxx910     = 0x00080000,
             xxxxx910P5   = 0x00100000,
             xxxxx910P6   = 0x00200000,
             xxxxx910P11  = 0x00400000,
             xxxxx910P12  = 0x00800000,
             xxxxx910P13  = 0x01000000,
             xxxxx910P14  = 0x02000000,
             xxxxx910P15  = 0x04000000,
             xxxxx910P16  = 0x08000000,
             xxxxx920     = 0x10000000,
             xxxxx920P1   = 0x20000000,
             xxxxx920P2   = 0x40000000,
             xxxxx920P3   = 0x80000000,
         };
    
    Versions newVersions = (Version)mComboBox->itemData(inIndex).toUInt();
     if ( newVersions < xxxxx500) //now newVersions is a negative value
     {
    
     }
     else
     {
    
     }
    

【问题讨论】:

    标签: enums hex


    【解决方案1】:

    在标准 C 中,枚举器的类型为 int,并且值必须在 int 的范围内。 0x80000000 超出了int 的范围,这是一个需要诊断的约束违规。

    所以发生了什么取决于你的编译器。编译器为超出int 范围的枚举器实现了自己的设计扩展。根据您发布的证据,编译器为该枚举器提供了 INT_MIN 的值(一个很大的负数)。

    您必须在设计代码时考虑到这一点,例如有 xxxxx920P3 的版本测试的特定分支。


    当一个枚举包含一堆一位标志时,通常是为了让它们可以组合在一起,例如xxxxx600 | xxxxx700 | xxxxx432 能够使用单个值来表示任意大小的元素集。

    【讨论】:

    • 谢谢。毫米。这是一个 qt C++ 项目。 xxxxx920P3 会通过 testFlag() 函数吗?例如。 if(m_P.versions().testFlag(xxxxx920P3) .
    • @Ming 不知道,这取决于该函数的定义方式
    • 你能看看这个问题吗?谢谢。 stackoverflow.com/questions/68404924/…
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2014-11-30
    • 2014-03-31
    • 1970-01-01
    • 2015-02-11
    • 2011-10-02
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多