【问题标题】:Enumerator value evaluates to 2147483648, which cannot be narrowed to type 'int'枚举器值计算为 2147483648,不能缩小到类型“int”
【发布时间】:2022-01-06 23:21:08
【问题描述】:

我创建了一个这样的枚举:

enum class CATEGORIES{
       C01 = 0x00000001,
       C02 = 0x00000002,
       C03  = 0x00000004,
       ...
       C26 = 0x02000000,
       C27 = 0x04000000,
       C28 = 0x08000000,
       C29 = 0x10000000,
       C30 = 0x20000000,
       C31 = 0x40000000,
       C32 = 0x80000000, //Error at this line
    }

枚举器值计算为 2147483648,不能缩小到 输入'int'

我应该如何解决?我只是想要一种方便的方式来表示类别,而枚举类似乎对命名空间有意义..

【问题讨论】:

标签: c++ c++11


【解决方案1】:

0x80000000 是基数为 10 的 2147483648int(大多数编译器上为 32 位)不能包含 2147483648

你应该这样做:

enum class CATEGORIES : unsigned long{
       C01 = 0x00000001,
       C02 = 0x00000002,
       C03 = 0x00000004,
       ...
       C26 = 0x02000000,
       C27 = 0x04000000,
       C28 = 0x08000000,
       C29 = 0x10000000,
       C30 = 0x20000000,
       C31 = 0x40000000,
       C32 = 0x80000000,
}; // also you seem to miss this semicolon

【讨论】:

  • 次要观点:“int 不能包含 2147483648”不太正确。 32 位 int 不能包含2147483648。根据编译器的不同,int 可能会更大(更不用说更小了)。 +1。
【解决方案2】:

有人提出以下建议,然后删除了他们的评论,但它似乎有效,使得底层类型为 unsigned int:

enum class CATEGORIES : uint32_t{
 ...
}

【讨论】:

    【解决方案3】:

    如果没有明确指定CATEGORIES 的基础类型是int,并且0x80000000 (2147483648) 在您的平台上超出int 的范围。

    您可以明确指定更大的类型(例如long;取决于您的需要)作为基础类型。

    enum class CATEGORIES : long {
       C01 = 0x00000001,
       C02 = 0x00000002,
       C03  = 0x00000004,
       ...
       C26 = 0x02000000,
       C27 = 0x04000000,
       C28 = 0x08000000,
       C29 = 0x10000000,
       C30 = 0x20000000,
       C31 = 0x40000000,
       C32 = 0x80000000,
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 2015-02-22
      相关资源
      最近更新 更多