小端存储格式:字数据的低字节存储在低地址中,高字节存储在高地址中。
大端存储格式:字数据的高字节存储在低地址中,低字节存储在高地址中。
小端存储和大端存储的区别是字中的字节的存储顺序不同,而字与字之间的存储顺序是相同的。
无论是大端小端存储,字地址总是指向低地址。
在这里的字指的是不同变量,例如:
int a;
int b;
&a取得的数据就是a所占有的四个字节的地址中的低地址。
栈地址的增长顺序:从高地址向低地址增长,空间较小(固定可变)
堆地址的增长顺序:从低地址向高地址增长,空间很大(可以认为是所有可用空闲内存)
栈和堆的地址增长顺序和编译器和操作系统有关系,通常情况下是上面所述。在笔试的时候若无特别说明,那就不用纠结了,就是上面的顺序。
struct和union中的存放顺序所有成员都是从低地址开始存放的,这里意思不是说先存放最后一个成员的,而是指的是在内存中的存储位置。成员的存放顺序是按照先声明的先分配内存。
大端小端对struct中位字段成员存放的影响:
- 大端先为一个成员的高位分配地址,小端先为成员的低位分配地址,来构成一个字节。
- 在构成的一个字节中的存放顺序,大端先存储第一个成员的bit,后存储第二个成员的bit。小端先存储第二个成员的bit,后存储第一个成员的bit。(属于同一个成员的bit顺序不变。)
下面是在Windows下测试的,小端存储中的位字段在内存中的存储方式:
struct Test{
unsigned short int a : 5;
unsigned short int b : 5;
unsigned short int c : 6;
};
void main()
{
test T;
T.a = 24;
T.b = 2;
T.c = 5;
int i = *(short*)&T;
cout << i << endl;
getchar();
return;
}
24 = 11000;
2 = 00010;
5 = 000101;
在内存中的存储顺序是:
010 11000 000101 00(按照分割顺序)
0101 1000 0001 0100
即:0x58 0x14
则得到的i在内存中的存放顺序是0x58 0x14; 大小为0x1458 = 5208
void main()
{
union{
struct{
unsigned short s1 : 3;
unsigned short s2 : 3;
unsigned short s3 : 2;
}x;
char c;
}v;
v.c = 103;
cout << v.x.s1 << endl;
cout << v.x.s2 << endl;
cout << v.x.s3 << endl;
}
按照上面的理论:struct在小端存储下的存储顺序应该是s3:s2:s1