大端与小端:
小端:字节的低位放在内存低位地址,高位放在内存高位地址。
大端:字节的高位地址放在内存低位地址,低位放在内存高位地址。
判断系统是大端还是小端?
若判断处理器是Big还是Little模式,有两种方法。
1、
int i=1;
char *p=(char *)&i;
if(*p==1)
printf("小端");
else
printf("大端");
大小端存储问题,如果小端方式(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端
字节对齐:
结构体的对齐参
1.Union
#include<stdio.h>
typedef union
{
char c[10];
char cc1;
}u11;//首先按照char c[10]分配10个字节,然后按照char的1个字节对齐,最终sizeof(u11)=10;
typedef union
{
char c[10];
int i;
}u22;//首先按照char c[10]分配10个字节,然后按照char的4个字节对齐,最终sizeof(u11)=12;
typedef union
{
char c[10];
double i;
}u33;//首先按照char c[10]分配10个字节,然后按照char的8个字节对齐,最终sizeof(u11)=16;
int main(void)
{
printf("sizeof(u11)%d\n",sizeof(u11));
printf("sizeof(u22)%d\n",sizeof(u22));
printf("sizeof(u33)%d\n",sizeof(u33));
return 0;
}
结果:
2.struct
#include<stdio.h>
struct{
short a1;
short a2;
short a3;
}A;//sizeof(short)=2,都是short,以2个字节整数倍对齐,最后为6.
struct{
long a1;
short a2;
}B;//sizeof(long)=4,sizeof(short)=2,以4个字节整数倍对齐,最后为8。
int main(void)
{
printf("sizeof(A)%d\n",sizeof(A));
printf("sizeof(B)%d\n",sizeof(B));
return 0;
}
结果: