2012-08-10 100 views
8

有鑄造結構爲uint64_t中或任何其他int類型的清潔方式,因爲在結構= <到的sizeof詮釋? 我唯一能想到的只是一個'好'的解決方案 - 使用工會。不過,我從來沒有喜歡他們。鑄造結構轉換成int

讓我添加一段代碼,以澄清:

typedef struct { 
uint8_t field: 5; 
uint8_t field2: 4; 
/* and so on... */ 
}some_struct_t; 

some_struct_t some_struct; 
//init struct here 

uint32_t register; 

現在怎麼辦我投some_struct捕捉其位uint32_t的寄存器順序。

希望能讓它更清晰一些。

+4

人們總是memcpy的! – 2012-08-10 14:32:16

+0

@MartinBeckett這將是一個不錯的答案:) – dasblinkenlight 2012-08-10 14:33:02

+7

不喜歡工會?工會正以您清楚,可維護的方式完成您想做的事。什麼只是「確定」呢? – 2012-08-10 14:34:26

回答

1

非便攜式解決方案:

struct smallst { 
    int a; 
    char b; 
}; 

void make_uint64_t(struct smallst *ps, uint64_t *pi) { 
    memcpy(pi, ps, sizeof(struct smallst)); 
} 

你可能會面臨的問題,如果你,例如,包小端機器上的結構和解壓大端機器上。

15

我剛剛打了同樣的問題,我有這樣的聯合解決它:

typedef union { 
    struct { 
     uint8_t field: 5; 
     uint8_t field2: 4; 
     /* and so on... */ 
    } fields; 
    uint32_t bits; 
} some_struct_t; 

/* cast from uint32_t x */ 
some_struct_t mystruct = { .bits = x }; 

/* cast to uint32_t */ 
uint32_t x = mystruct.bits; 

HTH, 亞歷

0

您可以使用指針,這將是例如容易 :

struct s { 
    int a:8; 
    int b:4; 
    int c:4; 
    int d:8; 
    int e:8; }* st; 

st->b = 0x8; 
st->c = 1; 
int *struct_as_int = st; 

希望它有助於

+0

這將需要在任何符合的編譯器中進行類型轉換,並且在許多編譯器上也需要使用'-fno-strict-aliasing'或一些類似的選項。 – supercat 2016-10-25 22:44:59