大端与小端的判断(之前在某贴下面看到了错误版本~_~)
《关于大端与小端的判断问题》
1. 什么是大端、小端?
大端:低位字节排放在内存的高地址端
小端:高位字节排放在内存的高地址端
2. 判断方法
小端:高位字节排放在内存的高地址端
0x11223344 | 低地址(内存) | 高地址(内存) | |||
---|---|---|---|---|---|
高尾端(大端) | 11 | 22 | 33 | 44 | |
低尾段(小端) | 44 | 33 | 22 | 11 |
1. 使用共用体
//是否为大端 bool IsBigEndian(){ union NUM{ int a; char b[4]; }num; num.a = 0x11223344; //之前在某篇面经里发现在讨论区说下面应该是num.b[3],当时以为是对的,实际是错的!! //首先共用体的所有数据成员公用一块内存 //其次,数组在栈中是按照地址增长的顺序排布的(栈的低地址到高地址) //你想想。int* p = new int[10]; ++p访问后面的元素 //划重点!!!if(num.b[3] == 0x11)是错的!!! if( num.b[0] == 0x11 ){ return true; } return false; }2. 直接判断
int main() { short int x; char x0,x1; x=0x1122; x0=*((char*)&x); //低地址单元 ,或者((char*)&x)[0];会产生内存截断 x1=*((char*)&x + 1); //高地址单元,或者((char*)&x)[1];会产生内存截断 printf("x0=%x\nx1=%x\n",x0,x1); } //若x0=0x11,则是大端;若为0x22是小端