Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8113673
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 6, 20262026-06-06T02:54:17+00:00 2026-06-06T02:54:17+00:00

I have a struct which corresponds to a register in hardware. typedef unsigned int

  • 0

I have a struct which corresponds to a register in hardware.

typedef unsigned int uint32;
typedef union A_u{
    uint32 words[4];
    struct {

        uint32 a : 2;
        uint32 b : 3;
        uint32 unused : 27;

        uint32 c : 2;
        uint32 d : 3;
        uint32 unused0 : 27;

        uint32 unused1 : 1;
        uint32 e : 1;
        uint32 f : 1;
        uint32 g : 1;
        uint32 h : 1;
        uint32 i : 1;
        uint32 unused2 : 26;

        uint32 reserved6 : 32;
       }s;
}A_t;

main()
{

    A_t obj;
    uint32 val = 1;

    memset(&obj, 0, sizeof(A_t));
    //fills data
    read_data(&obj);

    printf("0x%x\n", obj.words[2]);
    printf("obj.s.h = %d\n", obj.s.h);

}

Output is

0x80000000
obj.s.h = 1.

Though the 3rd word is 0x80000000, obj.s.h is shown as 1. I am not able to understand this.
I am running this on powerpc, where First bit field is Most significant bit.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-06T02:54:18+00:00Added an answer on June 6, 2026 at 2:54 am

    Compilers are fairly free to do what they like so far as how memory locations line up with the members of structs and unions and other complex data structures.

    I have seen mysterious run time errors using structs that were due to alignment boundary issues because one part of the source saw the struct one way and another saw it a different way.

    C basically uses a struct as a template to overlay a memory area and if different files see the struct in different ways, one piece of code is calculating an address offset to a struct member that is different from another.

    Some compilers will provide a pragma that will allow you to specify a pack action so that you can specify the alignment boundary of struct members.

    In order to maintain compatibility with hardware, the best course seems to be to use arrays of unsigned character because that way you can index to the unsigned character array element and then select one of the eight bits with bitwise operators. You can then wrap the unsigned character array within various access functions, classes, macros, etc to manipulate the actual data that you want to read and write. Using unsigned character arrays tends to be more portable as well.

    Bit fields seem to be more of a way for an application to maintain indicators and flags in a more memory conserving fashion but are not as useful for communication with entities (hardware or software) outside of the application. And depending on the compiler and the hardware on which the application is running, using bit fields may introduce a small run time penalty as bit fields are accessed and packed and unpacked.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a recursive struct which is: typedef struct dict dict; struct dict {
I have a struct PACKET which contains two int fields. How would I declare
I have a struct which has some vectors as members: struct my_struct { std::vector<int>
I have a struct which you see below: typedef struct _List { Person *person;
If I have the following: typedef struct _MY_STRUCT { int a; float b; }
I have a struct which has several arrays within it. The arrays have type
-In my c code I have a struct which contains many unknown sized arrays
For example, I have a struct which is something like this: struct Test {
I have a struct called coordinate which is contained in a list in another
I have defined a custom struct which I need to send over to another

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.