大端与小端的判断(之前在某贴下面看到了错误版本~_~)
《关于大端与小端的判断问题》
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是小端 