将枚举定义转换为unsigned int

Tho*_*ews 7 c enums casting iar unsigned-integer

根据这篇SO帖子:
C中枚举的大小是多少?
枚举类型有signed int类型.

我想将枚举定义从转换signed intunsigned int.

例如,在我的平台上,a unsigned int是32位宽.我想创建一个枚举:

typedef enum hardware_register_e
{
    REGISTER_STATUS_BIT = (1U << 31U)
} My_Register_Bits_t;
Run Code Online (Sandbox Code Playgroud)

我的编译器抱怨上面的定义超出范围(它用于a signed int).

我如何申报unsigned int enum价值?

编辑1:

  1. 首选项不是扩展到64位(因为代码驻留在嵌入式系统中).
  2. 由于技能限制,此项目不允许使用C++.:-(

编辑2:

  • 编译器是ARM​​7的IAR Embedded Workbench.

Nom*_*mal 3

不幸的是,ISO C 标准 (c99 6.4.4.3) 规定枚举常量的类型为int。如果你用eg编译上面的内容gcc -W -std=c89 -pedantic,它会发出警告ISO C restricts enumerator values to range of \xe2\x80\x98int\xe2\x80\x99 [-pedantic]。某些嵌入式编译器可能根本不接受该代码。

\n\n

如果您的编译器比较挑剔,您可以使用以下方法解决该问题

\n\n
typedef enum hardware_register_e\n{\n    REGISTER_STATUS_BIT = -2147483648   /* 1<<31, for 32-bit two's complement integers */\n} hardware_register_t;\n
Run Code Online (Sandbox Code Playgroud)\n\n

int但只有当您的架构上是 32 位二进制补码类型时,它才能正常工作。它适用于我使用过或听说过的所有 32 位和 64 位架构。

\n\n

编辑添加:ARM7使用32位二进制补码int类型,所以上面的应该可以正常工作。我只建议您保留注释,解释实际值是1<<31。你永远不知道是否有人移植了代码,或者使用了另一个编译器。如果新的编译器发出警告,同一行上的注释应该可以轻松修复。就我个人而言,我可能会将代码包装在条件中

\n\n
typedef enum hardware_register_e\n{\n#ifdef __ICCARM__\n    REGISTER_STATUS_BIT = -2147483648   /* 1<<31, for 32-bit two's complement integers */\n#else\n    REGISTER_STATUS_BIT = 1 << 31\n#endif\n} hardware_register_t;\n
Run Code Online (Sandbox Code Playgroud)\n