根据这篇文章:
What is the size of an enum in C?
枚举类型具有signed int类型。
我想将枚举定义从signed int转换为unsigned int
例如,在我的平台上,unsigned int的宽度是32位。
我要创建枚举:

typedef enum hardware_register_e
{
    REGISTER_STATUS_BIT = (1U << 31U)
} My_Register_Bits_t;

我的编译器抱怨上面的定义超出了范围(这是针对signed int)。
如何声明unsigned intenum值?
编辑1:
首选项是不要扩展到64位(因为代码驻留在
在嵌入式系统中)。
由于技能的限制,这个项目不允许使用C++。:。-(
编辑2:
编译器是用于arm7的iar嵌入式工作台。

最佳答案

不幸的是,iso c标准(c99 6.4.4.3)规定枚举常数的类型为int。如果您使用例如gcc -W -std=c89 -pedantic来编译上述内容,它将发出警告ISO C restricts enumerator values to range of ‘int’ [-pedantic]。一些嵌入式编译器可能根本不接受该代码。
如果编译器比较挑剔,可以使用

typedef enum hardware_register_e
{
    REGISTER_STATUS_BIT = -2147483648   /* 1<<31, for 32-bit two's complement integers */
} hardware_register_t;

但只有当int是架构上32位2的补码类型时,它才能正常工作。它是在所有32位和64位体系结构,我曾经使用或听说过。
编辑添加:ARM7使用32位2的补码int类型,因此上面的操作应该很好。我只建议您保留注释,解释实际值是1<<31。你永远不知道是否有人移植代码,或使用另一个编译器。如果新编译器发出警告,则同一行上的注释应使修复变得简单。就我个人而言,我可能会用一个条件来包装代码
typedef enum hardware_register_e
{
#ifdef __ICCARM__
    REGISTER_STATUS_BIT = -2147483648   /* 1<<31, for 32-bit two's complement integers */
#else
    REGISTER_STATUS_BIT = 1 << 31
#endif
} hardware_register_t;

10-07 12:30
查看更多