根据这篇文章:
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 int
enum
值?编辑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;