第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;
}