繁体   English   中英

将枚举定义转换为unsigned int

[英]Casting enum definition to unsigned int

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

我想将一个enum定义从signed int转换为unsigned int

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

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

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

如何声明unsigned int enum值?

编辑1:

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

编辑2:

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

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

东西是enum类型可以int类型但它们在C中不是int 。在gcc 1)上enum类型默认为unsigned int

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

在你的情况下, enum常量是int但你给它一个不适合int 你不能在C中使用unsigned int enum常量,因为C表示它们是int


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

遗憾的是,ISO C标准(c99 6.4.4.3)规定枚举常量的类型为int 如果使用例如gcc -W -std=c89 -pedantic编译上述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;

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

你不能(至少可以移植)改变枚举的类型。 标准很清楚,枚举常量的类型为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:

#define REGISTER_STATUS_BIT (1U << 31)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM