叁:サイズ端モード(Big_Little_Endian)

3042 ワード

1:プロセッサがマルチバイトデータを格納する場合、大端と小端モードが存在する.2:プロセッサが1バイトのデータを格納する場合、ビット順にも大端と小端モードが存在する.3:小端モード:低アドレスは低位のデータ(バイト)、高アドレスは高位のデータ(バイト)を格納する.4:大端モード:低アドレスは高位データ(バイト)、高アドレスは高位データ(バイト)を格納する.

One:コミュニティ構造を用いてマルチバイトメモリモードを判断する

/********************************
*Function: 
*Platform:X86
*Compiler:GCC
*Author:Programme By Golf
** *****************************/

#include 

typedef union 
{
    unsigned short  Data;
    struct
    {
        unsigned char a[2];
    }cc;
}Big_Little;

Big_Little big_little; 

void main()
{
    char *ptr1 = "Little_Mode"; 
    char *ptr2 = "Big_Mode";
    big_little.Data = 0x11aa;
    if(big_little.cc.a[0] == 0xaa && big_little.cc.a[1] == 0x11)
    {
        printf("big_little.Data = 0x%x
",big_little.Data); printf("addre = %p value = 0x%x
",&big_little.cc.a[0],big_little.cc.a[0]); printf("addre = %p value = 0x%x
",&big_little.cc.a[1],big_little.cc.a[1]); printf("%s
",ptr1); } if(big_little.cc.a[1] == 0xaa && big_little.cc.a[0] == 0x11) { printf("big_little.Data = 0x%x
",big_little.Data); printf("addre = %p value = 0x%x
",&big_little.cc.a[0],big_little.cc.a[0]); printf("addre = %p value = 0x%x
",&big_little.cc.a[1],big_little.cc.a[1]); printf("%s
",ptr2); } }

Two:コミュニティ構造を用いて単バイトメモリパターン(ビット順)を判断する

/********************************
 * *Function: 
 * *Platform:X86
 * *Compiler:GCC
 * *Author:Programme By Golf
 * ** *****************************/

#include 

typedef union
{
    unsigned char data;
    struct
    {
        unsigned char a:1;
        unsigned char b:1;
        unsigned char c:1;
        unsigned char d:1;
        unsigned char e:1;
        unsigned char f:1;
        unsigned char g:1;
        unsigned char h:1;
    }cc;
}big_little;

big_little Big_Little;

void main()
{
    
    Big_Little.data = 0x01;
    if(Big_Little.cc.a == 0x01)
        printf("Little_MOde
"); else if(Big_Little.cc.h == 0x01) printf("Big_MOde
"); else printf("error
"); }

Three:ポインタでサイズ端パターンを判断する

/******************************
* 
*Platform:X86
*Compiler:GCC
*Author:Programme By Golf
*****************************/

#include 

void main(void)
{
    char c1;
    char c2; 
    short *ptr;
    *ptr = 0x11aa;
    c1 = *((char *)ptr);
    c2 = *((char *)ptr+1);
    printf("c1_address = %p,c1_value = 0x%x
",(char *)ptr,(unsigned char)c1); printf("c2_address = %p,c2_value = 0x%x
",(char *)ptr+1,c2); if((unsigned char)c1 == 0xaa) printf("Little_Endian
"); if((unsigned char)c1 == 0x11) printf("Big_Endian
"); }

以上のコードはubuntu 10にある.04システムの検証に合格し、X 86アーキテクチャプロセッサは小端モードである.