[英]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.