首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >警告:左移位计数>=类型的宽度

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

Stack Overflow用户
提问于 2013-01-18 00:36:41
回答 3查看 4.4K关注 0票数 3

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

代码语言:javascript
运行
复制
enum wildcard {
  ....
  ....
  NW_SRC  = 0x111UL << 40,
  ....
};

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

代码语言:javascript
运行
复制
warning: left shift count >= width of type [enabled by default]

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-18 00:38:56

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

代码语言:javascript
运行
复制
enum wildcard {
    ....
    ....
    NW_SRC  = 0x111ULL << 40,
    ....
};

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

票数 2
EN

Stack Overflow用户

发布于 2013-01-18 00:44:17

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

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

代码语言:javascript
运行
复制
UINT64_C(0x111) << 40

具有适当宽度的常量。

但是根据标准的定义,枚举常量是int,所以如果您的平台上的int只有32位宽(很有可能是这样),这将不会帮助您定义一个足够大以保存值的枚举常量。

票数 3
EN

Stack Overflow用户

发布于 2013-01-18 00:39:19

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

但是正如Jens Gustedt在他们的答案中正确指出的那样,在C中,枚举不能容纳比更大的值,所以这不会有帮助。相反,C++允许用更大的整数类型表示枚举。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14383757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档