赞
踩
本实例的环境:win,需要用Visual Studio。
本菜狗一直迷糊大端小端到底是怎么回事,最近正好开始用Visual Studio看内存发现可以用实例直观感受win的小端模式。本例只分析win的小端模式,看懂小端自然就会明白大端是怎么回事。新手不要担心看不懂,跟着我的步骤走包教会,还是不太清楚可移步评论区讨论。话不多说,上菜。
- #include<stdio.h>
- int main() {
- int a[3];
- a[0] = 34;
- a[1] = 28;
- a[2] = 39;
- for (int i = 0; i < 3; i++){
- printf("Address of a+%d = %p\n", i, a+i);
- }
- }
会用内存监视器的同学可跳过
不会用的同学在跟着下图点击出这个小红点:
点出小红点之后,点启动调试,如下:
得到如下结果,打印了数据中三个int数据的地址:
因为程序中的下面句话作用是打印a+i地址:
printf("Address of a+%d = %p\n", i, a+i);
a+i是C数组指针部分的内容,a+i可理解为a[]数组中脚标为i的数组元素的地址。
跟着下图的步骤操作:
如下图,点击"添加监视"
如下图,你得到了a的地址,跟控制台输出的地址是一样的:
如下图,右键,勾选“十六进制显示”
如下图,得到数组的十六进制数00000022等
复制这个地址,本例是0x000000968fbcf6f8
跟着下图的步骤操作:
如下图,在搜索框粘贴刚才复制的地址,回车搜索。
第一行的前12个字节的16进制数,就是我们数组数据存放的位置
PS:如果没有地址搜索框, 右键,选择“显示工具栏就能看到搜索框。
你可以看到,对应的地址中(即搜索结果的第一行)存放着十六进制的a[0]、a[1]、a[2]的值,字长4字节的int数据被拆分成了4个1字节数据,倒序放在内存单元里。
现在让我们回忆一下小端模式是怎么要求的?数据的低位放在低地址空间,数据的高位放在高地址空间。
直观地用excel展示一下数据和地址的高低。
←数据高位 | 数据低位→ | ||
a[0] | 十进制 | 34 | |
十六进制 | 00 00 00 22 | ||
a[1] | 十进制 | 28 | |
十六进制 | 00 00 00 1c | ||
a[2] | 十进制 | 39 | |
十六进制 | 00 00 00 27 |
0x000000968FBCF6F8 | ||||||||||||||||
←地址低位 | 地址高位→ | |||||||||||||||
(该存储单元)第几字节 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
存储内容 | 22 | 0 | 0 | 0 | 1c | 0 | 0 | 0 | 27 | 0 | 0 | 0 | cc | cc | cc | cc |
←数据低位 | 数据高位→ | ←数据低位 | 数据高位→ | ←数据低位 | 数据高位→ |
上表记录了VS监视的数据存储结果,例如0x00000022被两位一分割(即1字节一分割),颠倒顺序放进了内存地址中。颠倒后符合小端的“数据的低位放在低地址空间,数据的高位放在高地址空间”的要求。
为了更好地理解,请自己分析0x0000001c和0x00000027哦~
欢迎评论区交流~如有错漏,恳请大家指正!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。