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

sizeof of struct with bit Field

please explain me why the sizeof (C51) returns 6 bytes for this struct instead of 5:

typedef struct DEKO_COMM_HEADER
{ UINT16 m_uiMsgOpcode;
UCHAR8 m_sblMsgPriority :2;
UINT16 m_sblDataLength :11;
UINT16 m_sblMsgTimeStamp :11;
}DEKO_COMM_HEADER, *PDEKO_COMM_HEADER;

UINT16 is typedef for unsigned int
UCHAR8 is typedef for unsigned char

thanks

Parents
  • Which compiler are you using ? Compiling your example shows a size of 7 which is correct since an UINT16 can hold a max. of 16 bits. Please look at the symbol listing for details on size and layout of the fields.

    C51 COMPILER V8.08a, COMPILATION OF MODULE Q
    OBJECT MODULE PLACED IN q.OBJ
    COMPILER INVOKED BY: c51.exe q.c CODE SB
    
    line level    source
    
       1          typedef unsigned char  UCHAR8;
       2          typedef unsigned int   UINT16;
       3
       4          typedef struct DEKO_COMM_HEADER  {
       5            UINT16     m_uiMsgOpcode;
       6            UCHAR8  m_sblMsgPriority : 2;
       7            UINT16   m_sblDataLength :11;
       8            UINT16 m_sblMsgTimeStamp :11;
       9          } DEKO_COMM_HEADER;
      10
      11
      12          unsigned char  z;
      13
      14          void main (void)  {
      15   1        z = sizeof (DEKO_COMM_HEADER);
      16   1      }
    ASSEMBLY LISTING OF GENERATED OBJECT CODE
                 ; FUNCTION main (BEGIN)
                                               ; SOURCE LINE # 14
                                               ; SOURCE LINE # 15
    0000 750007      R     MOV     z,#07H
                                               ; SOURCE LINE # 16
    0003 22                RET
                 ; FUNCTION main (END)
    
    
    NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
    ====                                    =====   ======  ====    ======  ====
    main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
    UINT16 . . . . . . . . . . . . . . . .  TYPEDEF  -----  U_INT    -----  2
    UCHAR8 . . . . . . . . . . . . . . . .  TYPEDEF  -----  U_CHAR   -----  1
    DEKO_COMM_HEADER . . . . . . . . . . .  TYPEDEF  -----  STRUCT   -----  7
      m_uiMsgOpcode. . . . . . . . . . . .  MEMBER   -----  U_INT    0000H  2
      m_sblMsgPriority . . . . . . . . . .  MEMBER   -----  FIELD    0002H  2.0
      m_sblDataLength. . . . . . . . . . .  MEMBER   -----  FIELD    0003H  11.0
      m_sblMsgTimeStamp. . . . . . . . . .  MEMBER   -----  FIELD    0005H  11.0
    DEKO_COMM_HEADER . . . . . . . . . . .  * TAG *  -----  STRUCT   -----  7
      m_uiMsgOpcode. . . . . . . . . . . .  MEMBER   -----  U_INT    0000H  2
      m_sblMsgPriority . . . . . . . . . .  MEMBER   -----  FIELD    0002H  2.0
      m_sblDataLength. . . . . . . . . . .  MEMBER   -----  FIELD    0003H  11.0
      m_sblMsgTimeStamp. . . . . . . . . .  MEMBER   -----  FIELD    0005H  11.0
    z. . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   U_CHAR   0000H  1
    

Reply
  • Which compiler are you using ? Compiling your example shows a size of 7 which is correct since an UINT16 can hold a max. of 16 bits. Please look at the symbol listing for details on size and layout of the fields.

    C51 COMPILER V8.08a, COMPILATION OF MODULE Q
    OBJECT MODULE PLACED IN q.OBJ
    COMPILER INVOKED BY: c51.exe q.c CODE SB
    
    line level    source
    
       1          typedef unsigned char  UCHAR8;
       2          typedef unsigned int   UINT16;
       3
       4          typedef struct DEKO_COMM_HEADER  {
       5            UINT16     m_uiMsgOpcode;
       6            UCHAR8  m_sblMsgPriority : 2;
       7            UINT16   m_sblDataLength :11;
       8            UINT16 m_sblMsgTimeStamp :11;
       9          } DEKO_COMM_HEADER;
      10
      11
      12          unsigned char  z;
      13
      14          void main (void)  {
      15   1        z = sizeof (DEKO_COMM_HEADER);
      16   1      }
    ASSEMBLY LISTING OF GENERATED OBJECT CODE
                 ; FUNCTION main (BEGIN)
                                               ; SOURCE LINE # 14
                                               ; SOURCE LINE # 15
    0000 750007      R     MOV     z,#07H
                                               ; SOURCE LINE # 16
    0003 22                RET
                 ; FUNCTION main (END)
    
    
    NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
    ====                                    =====   ======  ====    ======  ====
    main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
    UINT16 . . . . . . . . . . . . . . . .  TYPEDEF  -----  U_INT    -----  2
    UCHAR8 . . . . . . . . . . . . . . . .  TYPEDEF  -----  U_CHAR   -----  1
    DEKO_COMM_HEADER . . . . . . . . . . .  TYPEDEF  -----  STRUCT   -----  7
      m_uiMsgOpcode. . . . . . . . . . . .  MEMBER   -----  U_INT    0000H  2
      m_sblMsgPriority . . . . . . . . . .  MEMBER   -----  FIELD    0002H  2.0
      m_sblDataLength. . . . . . . . . . .  MEMBER   -----  FIELD    0003H  11.0
      m_sblMsgTimeStamp. . . . . . . . . .  MEMBER   -----  FIELD    0005H  11.0
    DEKO_COMM_HEADER . . . . . . . . . . .  * TAG *  -----  STRUCT   -----  7
      m_uiMsgOpcode. . . . . . . . . . . .  MEMBER   -----  U_INT    0000H  2
      m_sblMsgPriority . . . . . . . . . .  MEMBER   -----  FIELD    0002H  2.0
      m_sblDataLength. . . . . . . . . . .  MEMBER   -----  FIELD    0003H  11.0
      m_sblMsgTimeStamp. . . . . . . . . .  MEMBER   -----  FIELD    0005H  11.0
    z. . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   U_CHAR   0000H  1
    

Children
No data