第14話 エンディアンとビットフィールド


endian01.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 */

#include <stdio.h>

 

int main(void)

{

        FILE* fp ;

        int  i;

        char c[4];

 

        i=0x41424344;

 

        if( (fp = fopen( "test.bin", "wb" )) == NULL )  /* オープン     */

                return -1;

 

 

        if( fwrite( &i, sizeof(i), 1, fp ) !=   1 )     /*書き込み     */

        {

                fprintf( stderr, "エラー:ファイル書き込み.\n" ) ;

                fclose( fp ) ;                          /*クローズ     */

                return -1;

        }

 

        fclose( fp ) ;                                  /*クローズ     */

 

        if( (fp = fopen( "test.bin", "rb" )) == NULL )  /* オープン     */

                return -1;

 

        if( fread( c, sizeof(c), 1, fp ) !=     1 )     /*読み込み     */

        {

                fprintf( stderr, "エラー:ファイル読み込み.\n" ) ;

                fclose( fp ) ;                          /*ファイルクローズ */

                return -1;

        }

 

        fclose( fp ) ;                                  /*ファイルクローズ */

 

        printf( "i=0x%08X\n",i );

        printf( "c=0x%02X%02X%02X%02X\n",c[0],c[1],c[2],c[3] );

 

        return 0;

}


bits01.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * ビットの構造体&共用体

 */

#include <stdio.h>

 

struct  t_bits_signed

{

    signed

#if 1

                    /* Little Endian */

                    bit0:1,

                    bit1_30:30,

                    bit31:1;

#else

                    /* Big Endian */

                    bit31:1,

                    bit1_30:30,

                    bit0:1;

#endif

};

 

struct  t_bits_unsigned

{

    unsigned

#if 1

                    /* Little Endian */

                    bit0:1,

                    bit1_30:30,

                    bit31:1;

#else

                    /* Big Endian */

                    bit31:1,

                    bit1_30:30,

                    bit0:1;

#endif

};

 

union t_bi

{

    struct t_bits_signed    bits ;

    struct t_bits_unsigned  bitu ;

    unsigned int            i ;

};

 

int main(void)

{

    union t_bi bi;

 

    bi.i=0;

    printf("bi.i=0x%08X\n",bi.i);

 

    bi.bits.bit0 = 1;

    bi.bits.bit31 = 1;

    printf("bi.i=0x%08X\n",bi.i);

 

    bi.i=0;

    printf("bi.i=0x%08X\n",bi.i);

 

    bi.bitu.bit0 = 1;

    bi.bitu.bit31 = 1;

    printf("bi.i=0x%08X\n",bi.i);

 

    return 0;

}


bits02L.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * ビットの構造体&共用体

 */

#include <stdio.h>

 

struct t_bits

{

    unsigned

        /* Little Endian */

        bit0:1,

        bit1:1,

        bit2:1,

        bit3:1,

        bit4:1,

        bit5:1,

        bit6:1,

        bit7:1,

            bit8:1,

            bit9:1,

            bit10:1,

            bit11:1,

            bit12:1,

            bit13:1,

            bit14:1,

            bit15:1,

                bit16:1,

                bit17:1,

                bit18:1,

                bit19:1,

                bit20:1,

                bit21:1,

                bit22:1,

                bit23:1,

                    bit24:1,

                    bit25:1,

                    bit26:1,

                    bit27:1,

                    bit28:1,

                    bit29:1,

                    bit30:1,

                    bit31:1;

};

 

union t_bi

{

    struct t_bits   bit ;

    unsigned int    i ;

    unsigned char   c[4];

};

 

int main(void)

{

    union t_bi bi;

 

    bi.i=0;

 

    bi.bit.bit0  = 1;

    bi.bit.bit9  = 1;

    bi.bit.bit18 = 1;

    bi.bit.bit27 = 1;

 

    printf("bi.i=0x%08X, bi.c[0]=%u, bi.c[1]=%u, bi.c[2]=%u, bi.c[3]=%u\n",

        bi.i, bi.c[0], bi.c[1], bi.c[2], bi.c[3]);

 

    return 0;

}


bits02B.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * ビットの構造体&共用体

 */

#include <stdio.h>

 

struct t_bits

{

    unsigned

        /* Big Endian */

        bit31:1,

        bit30:1,

        bit29:1,

        bit28:1,

        bit27:1,

        bit26:1,

        bit25:1,

        bit24:1;

            bit23:1,

            bit22:1,

            bit21:1,

            bit20:1,

            bit19:1,

            bit18:1,

            bit17:1,

            bit16:1,

                bit15:1,

                bit14:1,

                bit13:1,

                bit12:1,

                bit11:1,

                bit10:1,

                bit9:1,

                bit8:1,

                    bit7:1,

                    bit6:1,

                    bit5:1,

                    bit4:1,

                    bit3:1,

                    bit2:1,

                    bit1:1,

                    bit0:1;

};

 

union t_bi

{

    struct t_bits   bit ;

    unsigned int    i ;

    unsigned char   c[4];

};

 

int main(void)

{

    union t_bi bi;

 

    bi.i=0;

 

    bi.bit.bit0  = 1;

    bi.bit.bit9  = 1;

    bi.bit.bit18 = 1;

    bi.bit.bit27 = 1;

 

    printf("bi.i=0x%08X, bi.c[0]=%u, bi.c[1]=%u, bi.c[2]=%u, bi.c[3]=%u\n",

        bi.i, bi.c[0], bi.c[1], bi.c[2], bi.c[3]);

 

    return 0;

}


eTest.c

//

// endian/bit field test

//

// (c)Copyright Spacesoft corp., 2006 All rights reserved.

//

// little endian machineでは結果は「80000000」となる.

// big    endian machineでは結果は「00000001」となる.

//

#include <stdio.h>

 

typedef struct {

        unsigned        rsvd1:1,

                                irp2en:1,

                                rsvd2:28,

                                rxsld:1,

                                flusherr:1;

} link_control_bits ;

 

 

int main( void )

{

        union link_control_u {

                link_control_bits       bit ;

                unsigned int            reg ;

        } link_control ;

 

        link_control.reg=0;

        link_control.bit.flusherr=1;

       

        printf("%08X",link_control.reg);

 

        return 0;

}

もどる