测试BigEndian/LittleEndian的正确方法

要测试本地机器是大头还是小头,下面的方法不可行:
1.左右移位运算
2.指针强转(大转小)
究其原因,内部编译器的设计是“揣摩了用户意图”的

看来,使用Union才是正确的
我的机器是AMD的,LittleEndian,返回Big的都是不正确的:

char* GetEndian()
{
    int i = 0xa0b0c0d;
    int iHigh = i>>24;//内部已经做过处理了 因为要按照用户本来的意愿工作  就得看char[]的内部存储方式
    if(iHigh == 0xa)
        return "Big Endian";
    else if(iHigh == 0xd)
        return "Little Endian";
    else
        return "Unknown";
}

char* GetEndian2()
{
    int x = 0x0a0b0c0d;
    int y = *(char*)&x;  //估计编译器也做了揣摩用户意图的工作 直接派给你想要的0xd了 也不work
    if(y== 0xa)//指针强转取前,类型强转取后? 截取这里按照低位截断
        return "Little Endian";
    else if(y == 0xd)
        return "Big Endian";
    else
        return "Unknown";
}

int is_little_endian(void)
{
    unsigned short flag=0x4321;
    int test1 = *(unsigned char*)&flag;//类型强转 低位截断 编译器肯定返回0x21啊
    int test2 = (char)flag;

    if (*(unsigned char*)&flag==0x21)
        return 0;
    else
        return 1;
}

void GetEndian3()
{
    union { 
        short  s; 
        char   c[sizeof(short)]; 
    } un;

    un.s = 0x0102; 
    if (sizeof(short) == 2) { 
        if (un.c[0] == 1 && un.c[1] == 2) 
            printf("big-endian\n"); 
        else if (un.c[0] == 2 && un.c[1] == 1) 
            printf("little-endian\n"); 
        else 
            printf("unknown\n"); 
    } else 
        printf("sizeof(short) = %d\n", sizeof(short));
}

void rub1()  //截断是从高位开始还是从低位开始?对于有符号与无符号之间的转换有没有特殊处理?
{
    int i = 0x0abb0cdd;//因为int是有符号的 最好能把最高位空出来
    short s_i = (short)i;
    if(s_i == 0x0abb)
        cout<<"从高处截断"<<endl;
    else if(s_i == 0xcdd)
        cout<<"从低位截断"<<endl;
    else
        cout<<"Unknown"<<endl;
}
void main()
{
#define HIINT64(i)    (( int)(i>>32))
#define LOINT64(i)   (( int)i)

    UINT64 i64 = 2147483647;
    cout<<"HI:  "<<HIINT64(i64)<<endl;
    cout<<"LO: "<<LOINT64(i64)<<endl;

    cout<<"sizeof(unsigned int):  "<<sizeof(unsigned int)<<endl;
    cout<<"sizeof(long):   "<<sizeof(long)<<endl;
    cout<<"sizeof(double):  "<<sizeof(double)<<endl;
    cout<<"sizeof(short):    "<<sizeof(short)<<endl;

    cout<<"Local Machine Endian:  "<<GetEndian()<<endl;
    cout<<"LittleEndian:  "<< is_little_endian()<<endl;
    cout<<"GetEndian2():  "<<GetEndian2()<<endl;
    cout<<"GetEndian3():  ";
    GetEndian3();

    rub1();

    system("pause");
}

运行结果:

HI:  0
LO: 2147483647
sizeof(unsigned int):  4
sizeof(long):   4
sizeof(double):  8
sizeof(short):    2
Local Machine Endian:  Big Endian
LittleEndian:  0
GetEndian2():  Big Endian
GetEndian3():  little-endian
从低位截断
请按任意键继续. . .

此外,截断一般都是低位截断

posted @ 2013-12-18 12:52  Tup  阅读(465)  评论(0)    收藏  举报