1 测试大小端
bool IsBig_Endian()
{
unsigned short test = 0x1234;
if(*( (unsigned char*) &test ) == 0x12)
return TRUE;
else
return FALSE;
}//IsBig_Endian()
2 小端:低地址存放地位数据;
大端:低地址存放高位数据;
而网络中传输是用大端。
用代码实现大小端利用了共用体的原理实现判断是比较简单的一个方法:
- #include <stdio.h>
- union n{
- int a;
- char b;
- };
- int main(){
- union n ss;
- ss.a=1;
- if(ss.b!=0)
- printf("Little\n");
- else
- printf("Big\n");
- return 0;
- }
由于共用体中的所有元素都存放在一块内存空间中,而b的起始地址是从int型的起始地址对齐的。所以对一个int型的数据进行写1,如果是大端的话,char型的b就会为1,否则b就为0.
3
内存地址 | 0x4000 | 0x4001 |
存放内容 | 0x34 | 0x12 |
内存地址 | 0x4000 | 0x4001 |
存放内容 | 0x12 | 0x34 |
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端......
上面的程序还可以看出,数据寻址时,用的是低位字节的地址。
#include <stdio.h>
union n
{
int a;
char b;
};
int main(){
union n ss;
ss.a=90;
ss.b = 6;
printf("b = %d\n", ss.b); // a为啥没有值
// 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
printf("a = %d b= %d\n", ss.a, ss.b);
if(ss.b!=0)
printf("Little\n");
else
printf("Big\n");
return 0;
}