簡體   English   中英

如何將signed int轉換為15位的bit-field?

[英]How to cast signed int to 15 bit bit-field?

我有一些位域:

int somefield : 15;

我正在嘗試將int轉換為15位(可以是正數或負數)。

有效地做到這一點的最佳做法是什么?

我正在嘗試將int轉換為15位(可以是正數或負數)。 有效地做到這一點的最佳做法是什么?

如果要轉換的int在15位有符號整數的范圍內,則使用以下代碼。 重要的是不使用int而不signed定義位域,因為這是C規范中的一個位置,它會有所不同。 如果沒有signed ,則int位字段可以實現為unsigned 它是實現定義的。

signed int somefield:15;
...
x.somefield = 12345;
int y = x.somefield;

如果要轉換的int可能超出15位有符號整數的范圍,則最好使用unsigned字段以具有可移植的一致定義行為。 目前還不清楚當int超出范圍時OP想要存儲什么值。 如果需要恢復標志,則可能需要一些額外的代碼。 根據編碼需要,寫入時不會產生額外開銷,也可能導致讀取開銷。

unsigned somefield:15;
...
x.somefield = 123456;

x.somefield = -1;
int y = x.somefield >= 0x4000 ? x.somefield - 0x8000 : x.somefield;

或者,如果要分配的值可能在位域范圍之外,則確保不會發生分配。 寫入時的額外開銷,讀取時沒有。

signed int somefield 15;
...
if (i >= INT15_MIN && i <= INT15_MAX) x.somefield = i;
else TBD();

int y = x.somefield;

chux,非常感謝! 我發現了另一種選擇,它看起來也很簡單:

typedef struct {
    unsigned int firstletter: 5;
    unsigned int secondletter: 5;
    unsigned int thirdletter: 5;
  } data_in_32_format;

typedef struct {
    unsigned int somedata: 15;
  } data;

typedef union {
    data_in_32_format;
    data;
  } common_data;

所以,當我自己編寫數據時,我正在寫:

common_data entry;
entry.data = getint_in_decimal_format;

比我用32格式打印:

print32("%c%c%c\n", entry.data_in_32_format.thirdletter
                  , entry.data_in_32_format.secondletter
                  , entry.data_in_32_format.firstletter);

因為我需要在之前正確地將它轉換為char(0-9 =>數字,> 9 - 字母,所以在ASCII中需要+55才能正確表示32位格式(A代表10等等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM