警告:左移计数> =类型的宽度

时间:2013-01-17 16:36:41

标签: c enums 64-bit

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

对于操作,您可以使用inttypes.h

中提供的宏
UINT64_C(0x111) << 40

具有适当宽度的常数。

但是根据标准的定义,枚举常量为int,因此如果在您的平台int上只有32,则无法帮助您定义一个足够大的枚举常量来保存值位宽(很可能)。

答案 1 :(得分:2)

您平台上的UL可能是32位。您可能需要使用ULL代替:

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

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

答案 2 :(得分:1)

UL是无符号长的,但多数编译器的长期是32位。您希望ULL为无符号长整数。

但是正如Jens Gustedt在答案中正确指出的那样,在C中,枚举不能保持大于int的值,所以这无济于事。相反,C ++允许枚举用更大的整数类型表示。