大端和小端,字节对齐

1)Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2)Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 小端模式存放内容 大端模式存放内容
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;

只要保证同一个字符变量在一个字节上即可

你可能感兴趣的:(大端,小端,字节对齐)