7

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

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

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

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

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

如何声明unsigned int enum值?

编辑1:

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

编辑2:

  • 编译器是用于 ARM7 的 IAR Embedded Workbench。
4

4 回答 4

4

根据这篇 SO 帖子:C 中枚举的大小是多少?枚举类型具有带符号的 int 类型。

问题是enum类型可以int类型,但它们不在intC 中。在gcc 1)上,默认情况下enum是类型unsigned int

enum常量是intenum类型是实现定义的。

在您的情况下,enum常量是int,但您给它的值不适合 a int。你不能unsigned int enum像 C 所说的那样在 C 中有常数int


1)gcc实现定义的枚举类型文档:“通常,如果枚举中没有负值,则类型为无符号整数,否则为整数” http://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations -and-bit_002dfields-implementation.html

于 2012-07-03T15:51:24.897 回答
3

不幸的是,ISO C 标准(c99 6.4.4.3)声明枚举常量的类型是int. 如果你用 eg 编译上面的代码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 位二进制补码类型时,它才能正常工作。它适用于我曾经使用或听说过的所有 32 位和 64 位架构。

编辑添加:ARM7 使用 32 位二进制补码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;
于 2012-07-03T15:57:31.060 回答
1

检查您的编译器是否有选项或编译指示使枚举无符号。如果不是,那么您只需要使用普通unsigned int(或固定宽度类型,例如uint32_t)而不是枚举,使用#defines 来定义它可以采用的值。

于 2012-07-03T15:50:07.113 回答
1

您不能(至少可移植地)更改枚举的类型。标准很清楚,枚举常量具有 type int。要摆脱警告,您可以使用演员表:

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

可能的替代方案

如果这不必在标头中,则可以使用const所需类型的对象而不是枚举常量:

const unsigned int REGISTER_STATUS_BIT = (1U << 31);

否则,您可以使用定义:

#define REGISTER_STATUS_BIT (1U << 31)
于 2012-07-03T15:50:18.067 回答