Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Is it possible to pack a struct in C to size defined by bits

I have the following struct

struct header {
    unsigned int op:16;
    unsigned int A:1;
    unsigned int B:1;
    unsigned int C:1;
    unsigned int pad:1;
}

int main() {
    struct header a;
     printf("size of header is: %lu\n", sizeof(a));

    return 0;
}

output is size of header is: 4

If I use __attribute__((__packed__))

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

struct __attribute__((__packed__)) header {
    unsigned int op:16;
    unsigned int A:1;
    unsigned int B:1;
    unsigned int C:1;
    unsigned int pad:1;
}

int main() {
    struct header a;
    printf("size of header is: %lu\n", sizeof(a));

    return 0;
}

output is size of header is: 3

Is there a way to avoid the padding to 3 bytes? Can I take only the required 20 bits?
One of the reason I need this is for converting the struct to a hex number e.g

struct header test1, test2;
test1.op = 1;
test1.A = 0;
test1.B = 1
test1.C = 0;
test1.pad = 0;

test2.op = 1024;
test2.A = 0;
test2.B = 1
test2.C = 1;
test2.pad = 0;

is converted to 0x20001 and 0x60400 respectively and would like to avoid the need to remove the padding if possible

>Solution :

Is it possible to pack a struct in C to size defined by bits

No.

Is there a way to avoid the padding to 3 bytes?

No.

Can I take only the required 20 bits?

No.

The smallest addressable unit is a byte. Everything in C has to be a multiple of a byte.

(Theoretically, you could use a compiler (or re-compile GCC) with a byte having 10 bits, then your struct would take exactly 2 bytes. That would be tedious, non-portable and I would say ridiculous). However, on any modern platform, a byte has 8 bits.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading