Вопрос по c, struct, casting – Приведение структуры в int

8

Есть ли чистый способ преобразования структуры в uint64_t или любой другой тип int, учитывая, что структура в & lt; = соответствует размеру 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;

Теперь, как мне привести cast_struct для захвата его порядка битов в регистре uint32_t.

Надеюсь, это немного прояснит ситуацию.

Всегда есть memcpy! Martin Beckett
Я тоже не люблю профсоюзы - у них слишком много политической власти :) :) :) dasblinkenlight
Не "увлекаюсь" союзов? Профсоюз делает именно то, что вы хотите сделать ясным и понятным способом. Что просто "хорошо"? об этом? Carey Gregory
Я понятия не имею, как на это ответить, не зная, для чего это нужно. Больше информации, пожалуйста. djechlin
Существует способ привести указатель структуры к указателю на int, но это очень вероятно повлечет за собой неопределенное поведение. Если вы больше любите неопределенное поведение, чем профсоюзы, этоlink показывает, как сделать взломать. dasblinkenlight

Ваш Ответ

3   ответа
1

Непереносимое решение:

struct smallst {
  int a;
  char b;
};

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

Вы можете столкнуться с проблемами, если, например, упаковать структуру на машине с прямым порядком байтов и распаковать ее на машине с прямым порядком байтов.

16

и решил ее с помощью такого объединения:

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;

НТН, Alex

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;

Надеюсь, поможет

Это потребует преобразования типов в любом соответствующем компиляторе, а также во многих компиляторах требует использования-fno-strict-aliasing или какой-то похожий вариант.

Похожие вопросы