看见这个判定方法很特别,收集了~
int i=1; char *p=(char *)&i; if(*p==1) printf("1"); else printf("2");
大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端。
int checkCPU( ) { { union w { int a; char b; } c; c.a = 1; return(c.b ==1); } }
内存地址
|
0x4000
|
0x4001
|
存放内容
|
0x34
|
0x12
|
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
|
0x4000
|
0x4001
|
存放内容
|
0x12
|
0x34
|
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
|
0x4000
|
0x4001
|
0x4002
|
0x4003
|
存放内容
|
0x78
|
0x56
|
0x34
|
0x12
|
内存地址
|
0x4000
|
0x4001
|
0x4002
|
0x4003
|
存放内容
|
0x12
|
0x34
|
0x56
|
0x78
|
short int x; char x0,x1; x=0x1122; x0=((char*)&x)[0]; //低地址单元 x1=((char*)&x)[1]; //高地址单元 若x0=0x11,则是大端; 若x0=0x22,则是小端
什么时候要进行大小端字节序的转换?
short 或者 long的数据在进行通信的时候最好养成:
1、发送的时候使用:htons(l)
2、接受的时候使用:ntohs(l) 而不要理会两边的通信是否需要这么做~~
当然了一般我都不用int型的数据通信,从来都是字符串通信,发送方利用sprintf组织,接收方利用atoi进行转换~~
参考链接:http://blog.csdn.net/dyllove98/article/details/8923298
原文地址:http://blog.csdn.net/a491057947/article/details/43279121