This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

struct with members' sizes

I'm using C51 v3.20, and when I compiled the following structure, the compiler allocates 6 bytes for it.

typedef struct t_channel_info {
	int target_temp:9;
	unsigned char control_mode:2;
	unsigned char status:2;
	unsigned char warming:1;
	int current_temp:9;
	unsigned char warm_proportion;
} t_channel_info;

Should not it allocate only (9+2+2+1+9+8)/8=4 bytes?

But, when I partition a 9-bit integer to 8 and 1 bits chars, the size reduces to 5 bytes.

Is there an explanation?

Parents
  • Thanks for your kind replies.

    Based on your comments and links, I modified the struct as follows:

    typedef struct tt_channel_info {
    	unsigned int warm_proportion:7;
    	int target_temp:9;
    	unsigned int control_mode:2;
    	unsigned int status:2;
    	unsigned int warming:1;
    	int current_temp:9;
    } tt_channel_info;
    
    tt_channel_info. . . . . . . . . . . .  TYPEDEF  -----  STRUCT   -----  4
      warm_proportion. . . . . . . . . . .  MEMBER   -----  FIELD    0000H  7.0
      target_temp. . . . . . . . . . . . .  MEMBER   DATA   FIELD    0000H  9.7
      control_mode . . . . . . . . . . . .  MEMBER   DATA   FIELD    0002H  2.0
      status . . . . . . . . . . . . . . .  MEMBER   DATA   FIELD    0002H  2.2
      warming. . . . . . . . . . . . . . .  MEMBER   DATA   FIELD    0002H  1.4
      current_temp . . . . . . . . . . . .  MEMBER   DATA   FIELD    0002H  9.5
    

    Yes, I changed the size of warm_proportion to 7 bits. It is OK to have values between 0-127 for this field.


Reply
  • Thanks for your kind replies.

    Based on your comments and links, I modified the struct as follows:

    typedef struct tt_channel_info {
    	unsigned int warm_proportion:7;
    	int target_temp:9;
    	unsigned int control_mode:2;
    	unsigned int status:2;
    	unsigned int warming:1;
    	int current_temp:9;
    } tt_channel_info;
    
    tt_channel_info. . . . . . . . . . . .  TYPEDEF  -----  STRUCT   -----  4
      warm_proportion. . . . . . . . . . .  MEMBER   -----  FIELD    0000H  7.0
      target_temp. . . . . . . . . . . . .  MEMBER   DATA   FIELD    0000H  9.7
      control_mode . . . . . . . . . . . .  MEMBER   DATA   FIELD    0002H  2.0
      status . . . . . . . . . . . . . . .  MEMBER   DATA   FIELD    0002H  2.2
      warming. . . . . . . . . . . . . . .  MEMBER   DATA   FIELD    0002H  1.4
      current_temp . . . . . . . . . . . .  MEMBER   DATA   FIELD    0002H  9.5
    

    Yes, I changed the size of warm_proportion to 7 bits. It is OK to have values between 0-127 for this field.


Children