测试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
从低位截断
请按任意键继续. . .
此外,截断一般都是低位截断。

浙公网安备 33010602011771号