存储顺序

来源:互联网 发布:sublime php 语法检查 编辑:程序博客网 时间:2024/05/20 15:10

小端存储格式:字数据的低字节存储在低地址中,高字节存储在高地址中。
大端存储格式:字数据的高字节存储在低地址中,低字节存储在高地址中。

小端存储和大端存储的区别是字中的字节的存储顺序不同,而字与字之间的存储顺序是相同的。
无论是大端小端存储,字地址总是指向低地址。
在这里的字指的是不同变量,例如:

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

0 0