11

構造体が <= int の sizeof であることを考えると、構造体を uint64_t または他の 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;

uint32_t レジスターのビット順序をキャプチャーするために some_struct をキャストするにはどうすればよいでしょうか。

それが少し明確になることを願っています。

4

3 に答える 3

26

私は同じ問題にぶつかったばかりで、次のようなユニオンで解決しました:

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、アレックス

于 2013-05-07T14:27:19.960 に答える
2

移植性のないソリューション:

struct smallst {
  int a;
  char b;
};

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

たとえば、リトルエンディアン マシンで構造体をパックし、ビッグ エンディアン マシンでアンパックすると、問題が発生する可能性があります。

于 2012-08-10T14:41:11.193 に答える
1

ポインターを使用できます。たとえば、次のように簡単に使用できます。

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;

それが役に立てば幸い

于 2016-10-25T07:00:40.853 に答える