1)Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2)Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
内存地址 | 小端模式存放内容 | 大端模式存放内容 |
0x4000 | 0x34 | 0x12 |
0x4001 | 0x12 | 0x34 |
判断大小端的C语言程序
inti=1;
char*p=(char*)&i;
if(*p==1)
printf("LittleEndian");
else
printf("BigEndian");
需要字节对齐的根本原因在于CPU访问数据的效率问题,系统一次访问0-3,3-7,等地址上的数据,若一个int型数据存储在2,3,4,5地址上,则需要访问内存两次,如果存在0,1,2,3地址上,则只需访问一次内存。
1、对于一个类型的数据,它存放的起始地址只要是它的类型的大小的整数倍就行了。若inta,则a只要存放在地址0,4,8,12.。。。。等地址上即可(int为4字节)。若charb,则存放在0,1,2,3,4,5,。。。任意一个地址开始的就行。若shortb,则存放在0,2,4,6,8。。。等地址上。
float为4字节,double为8字节。其实对齐问题是考虑在结构体中的,单独定义一个变量或数组好像考虑这个意义不大。
2、结构体是按其定义的数据类型的最大的那个对齐的。
structtest
{
charx1;
charx4;
shortx2;
charx5;
};
运行后的结果sizeof(test)=6;而不是5。
0:x11:x42-3:x24:x5
地址0存储x1地址1存储x4地址2、3存储x2地址4存储x5
主要是考虑到结构体数组的问题。结构体的大小必须是其中最大变量占用空间的整数倍。
structtest
{
charx1:2;
charx4:6;
charx2:7;
charx5:4;
};
sizeof(test)=3;
若修改为
structtest
{
charx1:2;
charx4:7;
charx2:7;
charx5:4;
};
sizeof(test)=4;
只要保证同一个字符变量在一个字节上即可
转载于:https://blog.51cto.com/lihaichuan/1304010