铸造结构转换成int(Casting struct into int)

2019-07-30 21:58发布

是否有铸造结构为uint64_t中或任何其他int类型的清洁方式,因为在结构<=到的sizeof诠释? 我能想到的唯一的事情只是一个“OK”的解决方案 - 使用工会。 但是我从来没有喜欢它们。

让我添加一段代码,以澄清:

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的寄存器顺序。

希望这使得它更清楚一点。

Answer 1:

我刚刚打了同样的问题,我有这样的联合解决它:

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,亚历克斯



Answer 2:

非便携式解决方案:

struct smallst {
  int a;
  char b;
};

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

你可能会面临的问题,如果你,例如,包小端机器上的结构和解压大端机器上。



Answer 3:

您可以使用指针,这将是容易的,例如:

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;

希望能帮助到你



文章来源: Casting struct into int
标签: c casting struct