簡體   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