Casting struct into int

前端 未结 3 412
长情又很酷
长情又很酷 2021-01-04 19:29

Is there a clean way of casting a struct into an uint64_t or any other int, given that struct in <= to the sizeof int? The only thing I can think of is only an \'ok\' sol

相关标签:
3条回答
  • 2021-01-04 19:53

    you can use pointers and it will be easy for example:

    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;
    

    hope it helps

    0 讨论(0)
  • 2021-01-04 19:58

    I've just hit the same problem, and I solved it with a union like this:

    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, Alex

    0 讨论(0)
  • 2021-01-04 20:09

    A non-portable solution:

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

    You may face problems if you, for example, pack the struct on a little-endian machine and unpack it on a big-endian machine.

    0 讨论(0)
提交回复
热议问题