構造体 & 共用体

構造体と共用体のコラボレーションです。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. 構造体と共用体のコラボレーションです。 (^_^;)
    構造体は共用体と組み合わせて使われることが良くあります。
    PC-98XX 時代の16ビットアセンブラで使っていたものを思い出してプログラムしてみました。 0(^_^)0
    ax は16ビットのレジスタですが、上位8ビットは ah レジスタに、下位8ビットは al レジスタに格納されています。
    ax と ah,al は同じレジスタなので ax = 0x0123; を実行すると ah に 01 が、al に 23 が格納されます。
    struct で定義されている順番を見て下さい。
    ah と al が逆ではないかと思われるでしょうが、現在主流の MPU はこの形式になっています。 (^_^;)
    /*★ union & struct  のテスト     前田 稔 ★*/
    #include <stdio.h>
    #include <conio.h>
    
    union
    {   unsigned short ax;
        struct
        {   unsigned char al;
            unsigned char ah;
        };
    } areg;
    
    int main(void)
    {
        areg.ax = 0x0123;
        printf("ax= %x,  ah= %d,  al= %d\n", areg.ax, areg.ah, areg.al);
        _getch();
        return 0;
    }
    
  2. 今度は共用体の形を宣言するコードと、領域を定義するコードを分けてみました。
    /*★ union & struct  のテスト     前田 稔 ★*/
    #include <stdio.h>
    #include <conio.h>
    
    union UAreg
    {   unsigned short ax;
        struct
        {   unsigned char al;
            unsigned char ah;
        };
    };
    union  UAreg    areg;
    
    int main(void)
    {
        areg.ax = 0x0123;
        printf("ax= %x,  ah= %d,  al= %d\n", areg.ax, areg.ah, areg.al);
        _getch();
        return 0;
    }
    
  3. union を typedef で宣言してみました。
    typedef で共用体を宣言すると、頭の union を省略することが出来ます。
    この後で説明する Object Class も加わり、ソースコードを見ただけでは、益々何が何だか解らなくなりました。 (^_^;)
    /*★ union & struct  のテスト     前田 稔 ★*/
    #include <stdio.h>
    #include <conio.h>
    
    typedef union
    {   unsigned short ax;
        struct
        {   unsigned char al;
            unsigned char ah;
        };
    } UAreg;
    
    UAreg   areg;
    
    int main(void)
    {
        areg.ax = 0x0123;
        printf("ax= %x,  ah= %d,  al= %d\n", areg.ax, areg.ah, areg.al);
        _getch();
        return 0;
    }
    
  4. まだまだ「構造体と共用体とClass」の料理が続くのですが、もうお腹がいっぱいになったでしょうか。 (^_^;)
    「ah と al が逆ではないか」の話が出てきましたが、ついでに32ビットではどうなるかを説明しておきます。
    data.lData の unsigned long(32ビット)の領域に 01020304 を格納します。
    先頭から8ビットずつ c1, c2, c3, c4 を表示すると、表示の順はどうなるでしょう。 (?_?;
    答えは 04, 03, 02, 01 の順に表示されるのでプログラムを実行して確かめて下さい。
    /*★ union & struct  のテスト     前田 稔 ★*/
    #include <stdio.h>
    #include <conio.h>
    
    typedef union
    {   unsigned long lData;
        struct
        {   unsigned char c1;
            unsigned char c2;
            unsigned char c3;
            unsigned char c4;
        };
    } UData;
    UData   data;
    
    int main(void)
    {
        data.lData = 0x01020304;
        printf("lData= %x,  c1= %d,  c2= %d,  c3= %d,  c4= %d",
               data.lData, data.c1, data.c2, data.c3, data.c4);
        _getch();
        return 0;
    }
    

超初心者のプログラム入門(C/C++)