我已经在我的头文件中声明了这个枚举:
enum wildcard {
....
....
NW_SRC = 0x111UL << 40,
....
};
当我编译它时,我收到以下警告:
warning: left shift count >= width of type [enabled by default]
int
我认为这是因为枚举类型被编译器视为一个。我该如何解决这个问题?
您有两个不同的问题,首先是操作,然后是常量的声明。
对于操作,您可以使用提供的宏inttypes.h
UINT64_C(0x111) << 40
有一个适当宽度的常数。
但是枚举常量是由标准定义的,因此如果在您的平台上只有 32 位宽(很可能)int
,这将无法帮助您定义一个足够大以容纳该值的枚举常量。int
您平台上的UL
可能是 32 位的。您可能需要ULL
改用:
enum wildcard {
....
....
NW_SRC = 0x111ULL << 40,
....
};
这将修复警告,但表达式的结果可能不一定适合 an enum
(有关详细信息和对相关标准文档的引用,请参阅此答案)。
UL
是无符号长的,但大多数编译器上的长是 32 位的。你想要ULL
unsigned long long。
但正如 Jens Gustedt 在他们的回答中正确指出的那样,在 C 中,枚举不能保存大于 int 的值,所以这无济于事。相比之下,C++ 确实允许用更大的整数类型来表示枚举。