[英]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
值?
根据这篇SO帖子:C中枚举的大小是多少? 枚举类型已签署int类型。
东西是enum
类型可以是int
类型但它们在C中不是int
。在gcc
1)上 , enum
类型默认为unsigned int
。
enum
常量是int
但enum
类型是实现定义的。
在你的情况下, enum
常量是int
但你给它一个不适合int
。 你不能在C中使用unsigned int
enum
常量,因为C表示它们是int
。
遗憾的是,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.