大小端是不同的对于数据在内存地址中的存放方式,不同的处理器(平台)的数据存储方式是不同。的如果
实现跨平台通信则大小端是不能忽视的问题。
大端模式:数据的高位存储在内存的低字节。ARM/PowerPC等处理器采用大端模式
小端模式:数据的地位存储在内存的低字节。Intel架构处理器采用小端模式。
如一个数据:0x12345678;对应内存地址是0x00~0x03。
大端模式 小端模式
地址:0x00 0x01 0x02 0x03 地址:0x00 0x01 0x02 0x03
数据:0x12 0x34 0x56 0x78 数据:0x78 0x56 0x34 0x12
关于一个大小端字节序的面试题:
方式1(60分).
#include <stdio.h>
int main()
{
int a = 0x12345678;
int *pa = &a;
char *p = (char *)&a;
printf("address of a is %p\n",pa);
printf("No.1 address: %p,data:0x%p\n",p,*p);
p++;
printf("No.2 address: %p,data:0x%p\n",p,*p);
p++;
printf("No.3 address: %p,data:0x%p\n",p,*p);
p++;
printf("No.4 address: %p,data:0x%p\n",p,*p);
p++;
int b = htonl(a);
p=(char *)&b;
printf("address of a is %p\n",pa);
printf("No.1 address: %p,data:0x%p\n",p,*p);
p++;
printf("No.2 address: %p,data:0x%p\n",p,*p);
p++;
printf("No.3 address: %p,data:0x%p\n",p,*p);
p++;
printf("No.4 address: %p,data:0x%p\n",p,*p);
p++;
return 0;
}
方式2(80分).
#include <stdio.h>
int daxiao()
{
int a = 0x01;
char *p = (char *)&a;
if(*p == a){
return 1;
}else{
return 0;
}
}
int main()
{
if(daxiao() == 1){
printf("edian\n");
}else{
printf("big\n");
}
return 0;
}
方式3(100分).
#include <stdio.h>
int daxiao()
{
union{
int a;
char c;
}data;
data.a = 1;
if(data.c == 1){
return 1;//xiao duan
}
}
int main()
{
if(daxiao() == 1){
printf("edian\n");
}else{
printf("big\n");
}
return 0;
}
方法三用联合体的巧妙方式,int 和char 型的首地址内存存放‘1’为相同时,为小端字节序。