存储顺序
来源:互联网 发布: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
- 顺序存储
- 顺序存储
- 顺序存储
- 存储顺序
- 顺序存储 链式存储
- 顺序存储与链式存储
- 顺序存储和链式存储
- 栈顺序存储&链式存储
- 链表存储,顺序存储
- 栈的顺序存储
- 顺序存储堆栈
- 顺序存储队列
- 机器字节存储顺序
- 字符串顺序存储
- 信息存储---字节顺序
- 二叉树顺序存储
- 栈 -- 顺序存储结构
- 栈--顺序存储
- 在安装VS2010的windows环境下搭建QT开发环境
- QDataStream 二进制数据读写
- 项目导入时gradle的配置
- Caffe_Layer源码解析
- Linux 嵌入式学习入门(1)
- 存储顺序
- 关于火狐浏览器firebug不能启动问题
- 剑指offer-面试题2 实现单例模式
- UVa_Dropping Balls(tree)
- 307. Range Sum Query
- 我设计的网站的分布式架构
- Java大文件的分割和合并
- tar命令几个常用参数解读
- Dubbo详细介绍与安装使用过程