1 示例代码
对于以下代码:
int main()
{int a = 100010001000;int b = 100;cout << "a = " << a << " " << &a << endl;cout << "b = " << b << " " << &b << endl;system("pause");return 0;
}
输出结果为:
2 设置断点调试
下面我们使用断点调试技术,在结束前打上断点,以便于我们查看内存
- 按F9打上断点
- 再按F5进行调试
- 再按回车
得到以下结果
3.1 注意事项
打了断点的含义是:该行不会被执行,在其之前的会被执行
对于上图,13行不会被执行,13行(不包含)之前的会被执行。
3 查看内存
然后做如下操作,以查看内存:
设置字节显示情况,对于int来说,这里是4个字节的,选择4,观察可以得到:地址的连续性也是不断+4的
这里涉及到一个引申的知识点,重点强调一下
4 内存查看方式分析
我们观察到对于int a = 100;在内存上显示是这样的
它采用十六进制来显示,这是为了方便人类查看,当然,十六进制的发明还有很多原因和应用,这里不再扩展。
每两个十六进制位,就是一个字节,因此上面是两两显示的,但是值得注意的是,这种四字节查看方式,实际上,00 00 00的地址只是隐藏了而已,让我们使用单字节查看方式,你就瞬间明白了
事实上,单字节的查看方式,更加符合内存的存储单元的实际情况。
这里要尤为注意
- 地址越大,权重越高,也就是下面的是高字节,上面的是低字节
5 建立关联:汇编语言
我们来回看一下**《汇编语言》**中的内存情况,进一步阐述。
5.1 基本单位为字节的情况
一个存储单元,对应8个二进制位,2个十六进制位
存储单元的编号,也就是内存地址
5.2 基本单位为二进制位的情况
甚至,对于二进制位的描述,也是自上而下权重升高的
不过值得说明的是,这只是一种通用的习惯,并不是强制性的,与实际硬件的实现方式也关系不大。
6 扩展阅读
【扩展材料】
- 大端序与小端序1
- 大端序与小端序2
在此链接我再补充一点:我们常用的,比如十进制的8,表示为0000_1000,这就是小端序
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
---|
按照标准,小端序:数据的高位字节存放在地址的高端 低位字节存放在地址低端
这一点也印证了上述第五节的观点,高位地址的权重更大
低地址 | 0x0015F740 | 98 |
---|---|---|
↓ | 0x0015F741 | AB |
↓ | 0x0015F742 | B8 |
↓ | 0x0015F743 | 9A |
↓ | 0x0015F744 | 10 |
↓ | 0x0015F745 | 22 |
↓ | 0x0015F746 | FB |
高地址 | 0x0015F747 | 00 |
7 疑问
问题1:在地址0x0015F741中最前面的0x是什么含义?**
在C/C++中,0x或0X代表十六进制的前缀,这也就解释了为什么后面的用十六进制表示的地址。
在java7以后,有以下前缀,来代表不同的进位计数制(以下的0中间带圆点,类似于扁的⊙)
- 二进制:0b或者0B
- 八进制:0(难区分,不常用)
- 十六进制: 0x或0X
- 十进制:不写前缀
7.1 扩展:进位计数制的前缀和后缀
在Verilog和数字逻辑中,十六进制使用h或者H来表示
十六进制的表示有
- 前缀: 0x或0X
- 后缀: h或H
具体使用h还是0x,取决于使用环境
同理,二进制和八进制也有前缀和后缀
- 二进制
- 前缀:0b或0B
- 后缀:b或B
- 八进制 【不常用】
- 0
- o或O
对于十进制
- 没有前缀,不写前缀就是的十进制
- 后缀:d或D