5分钟彻底理解大端小端--Visual Studio查看内存地址的分析方法

本实例的环境:win,需要用Visual Studio。

本菜狗一直迷糊大端小端到底是怎么回事,最近正好开始用Visual Studio看内存发现可以用实例直观感受win的小端模式。本例只分析win的小端模式,看懂小端自然就会明白大端是怎么回事。新手不要担心看不懂,跟着我的步骤走包教会,还是不太清楚可移步评论区讨论。话不多说,上菜。

 

1 设置断点,监视内存

1.1 在Visual Studio创建如下源程序:

#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);
	}
}

1.2 设置断点

会用内存监视器的同学可跳过

不会用的同学在跟着下图点击出这个小红点:

c069271af9b04446a749bde38651ce93.png

 点出小红点之后,点启动调试,如下:

1b6d0dac7bed4dbbbbcecacb3bb6374f.png

  得到如下结果,打印了数据中三个int数据的地址:

54a561d7cadb409398120e10facf633f.png

 因为程序中的下面句话作用是打印a+i地址:

printf("Address of a+%d = %p\n", i, a+i);

a+i是C数组指针部分的内容,a+i可理解为a[]数组中脚标为i的数组元素的地址。

 1.3 监视内存

跟着下图的步骤操作: 

a008f8f556fc491ab512294ad11b83fe.png

 如下图,点击"添加监视"

5a14cad7f4494602b39e0387f345bd93.png

 如下图,你得到了a的地址,跟控制台输出的地址是一样的:

c79ea025840b4e8fb344094d25dc294c.png

 如下图,右键,勾选“十六进制显示”

c9ae0741a761466d96e230a81f432e4e.png

fe7b2530fdf648a58e5e99747010bcd6.png 如下图,得到数组的十六进制数00000022等

3e1bdae9bfdc493b9426addeaa7620a7.png

 复制这个地址,本例是0x000000968fbcf6f8

跟着下图的步骤操作:

17b6199677f74b908a2befb3f30e3544.png

如下图,在搜索框粘贴刚才复制的地址,回车搜索。
第一行的前12个字节的16进制数,就是我们数组数据存放的位置

PS:如果没有地址搜索框, 右键,选择“显示工具栏就能看到搜索框。

238d3bd785414955a3bd0847ce7afcd6.png

 你可以看到,对应的地址中(即搜索结果的第一行)存放着十六进制的a[0]、a[1]、a[2]的值,字长4字节的int数据被拆分成了4个1字节数据,倒序放在内存单元里。

 

2 分析

现在让我们回忆一下小端模式是怎么要求的?数据的低位放在低地址空间,数据的高位放在高地址空间。

直观地用excel展示一下数据和地址的高低。

  ←数据高位数据低位→
a[0]十进制34
十六进制00 00 00 22
a[1]十进制28
十六进制00 00 00 1c
a[2]十进制39
十六进制00 00 00 27
 0x000000968FBCF6F8
 ←地址低位地址高位→
(该存储单元)第几字节0123456789101112131415
存储内容220001c00027000cccccccc
 ←数据低位数据高位→←数据低位数据高位→←数据低位数据高位→    

上表记录了VS监视的数据存储结果,例如0x00000022被两位一分割(即1字节一分割),颠倒顺序放进了内存地址中。颠倒后符合小端的“数据的低位放在低地址空间,数据的高位放在高地址空间”的要求。

为了更好地理解,请自己分析0x0000001c和0x00000027哦~

欢迎评论区交流~如有错漏,恳请大家指正!

 

 

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值