てりーぬの成長ブログ

1. 私の記録(ブログ)が誰かの役に立つように。1. 私のイラストでほっこり笑顔を届ける。1. たくさんの人に見てもらえるように工夫する。1. 自分が見返したとき笑顔になれるように記録を残す。

構造体と共用体の違い

共用体と構造体の違い

構造体はすべてのメンバーに対して、同時に別々の値を代入することができる。
共用体は、一つの変数に対し、どれか一つのメンバーしか同時に使えない。
参考:http://c-lang.sevendays-study.com/ex-day5_union.html

例)「BYTEデータからBITデータを取り出す方法」の共用体を構造体で作った場合で比較してみる

/*
 *  データを格納する共用体
 */
union MSG_BUFFER {
    unsigned char BYTE;
    struct {
        unsigned int    state : 4;
        unsigned int    id : 4;
    } BIT;
};

void main(void){
    union  MSG_BUFFER msg;
    msg.BYTE = 0x1a;    // test data
    syslog(LOG_NOTICE, " BIT.state : 0x%3X\n BIT.id : 0x%3X", msg.BIT.id, msg.BIT.state);
            
    /* 結果
    *   BIT.id : 0x  1
    *  BIT.state : 0x  A
    */

}

/*
 *  データを格納する構造体
 */
typedef struct {
    unsigned char BYTE;
    struct {
        unsigned int    state : 4;
        unsigned int    id : 4;
    } BIT;
}MSG_BUFFER;

void main(void){
    union  MSG_BUFFER msg;
    msg.BYTE = 0x1a;    // test data
    syslog(LOG_NOTICE, " BIT.state : 0x%3X\n BIT.id : 0x%3X", msg.BIT.id, msg.BIT.state);
            
    /* 結果
    *   BIT.id : 0x  0
    *  BIT.state : 0x  0
    */

}

あんまり理解できてなかったけど、使うとわかる。
やっぱり覚えたことのアウトプットって大切。

 

*******記事の更新記録*******

2021/11/26....初回記録!<更新!

*********************