【问题标题】:Warning : left shift count >= width of type警告:左移计数 >= 类型宽度
【发布时间】:2013-01-17 16:36:41
【问题描述】:

我已经在我的头文件中声明了这个枚举:

enum wildcard {
  ....
  ....
  NW_SRC  = 0x111UL << 40,
  ....
};

当我编译它时,我收到以下警告:

warning: left shift count >= width of type [enabled by default]

我认为这是因为枚举类型被编译器视为int。我该如何解决这个问题?

【问题讨论】:

标签: c enums 64-bit


【解决方案1】:

你有两个不同的问题,首先是操作,然后是常量的声明。

对于该操作,您可以使用inttypes.h 中提供的宏

UINT64_C(0x111) << 40

要有一个适当宽度的常数。

但是根据标准的定义,枚举常量是 int,因此如果在您的平台上 int 仅 32 位宽(即很有可能)。

【讨论】:

  • 在 C++ 中,枚举由一个足够大以容纳所有枚举值的整数类型表示,这意味着在这种情况下它应该由 long long 表示。 C标准真的不做同样的保证吗?
  • @JackAidley:C 2011 6.7.2.2 2:“定义枚举常量值的表达式应为整数常量表达式,其值可表示为 int。” C 2011 6.7.2.2 3:“枚举器列表中的标识符被声明为具有 int 类型的常量……”
  • @Eric:谢谢。有趣的是,C 和 C++ 中的这些微小差异如何让您脱颖而出。
  • @JackAidley,是的,这实际上是一个令人讨厌的区别,因为这是关于类型常量和接口定义的。
【解决方案2】:

您平台上的UL 可能是32 位的。您可能需要改用ULL

enum wildcard {
    ....
    ....
    NW_SRC  = 0x111ULL << 40,
    ....
};

这将修复警告,但表达式的结果可能不一定适合enum(有关详细信息和相关标准文档的参考,请参阅this answer)。

【讨论】:

    【解决方案3】:

    UL 是 unsigned long,但大多数编译器上的 long 是 32 位的。你想要 ULL 为 unsigned long long。

    但是正如 Jens Gustedt 在他们的回答中正确指出的那样,在 C 中,枚举不能保存大于 int 的值,因此这无济于事。相比之下,C++ 确实允许使用更大的整数类型来表示枚举。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多