繁体   English   中英

内存地址和偏移量

[英]Memory address and offset

我对内存地址如何存储值有一个新手问题。

例如,

addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  +0123456789ABCDEF
0000  50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20   Pax is a really 
0010  63 6F 6F 6C 20 67 75 79 00                        cool guy.

地址是0000吗? 50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20是存储在0000地址中的值吗?

0000是地址,来自标签addr 存储在0000处的唯一值是50 每个字节都有其自己的地址:

------+--------
 addr |  data
------+--------
 0000 | 50
 0001 | 61
 0002 | 78
 0003 | 20
 0004 | 69
 0005 | 73
 0006 | 20
 0007 | 61
 0008 | 20
 0009 | 72
 000A | 65
 000B | 61
 000C | 6C
 000D | 6C
 000E | 79
 000F | 20

例如,如果您考虑将0000作为基地址,则可以说20 ,最后一个值存储在F0000 + F = 000F ,即基地址+从该地址的偏移量。

0000可能只是本地地址的偏移量。 基本上, BaseAddress + 0000BaseAddress + 0010等。

值是ASCII,并且与右侧的字符匹配。 您已在该内存中存储了一条短信(或字符串)。

每个存储器地址存储一个字节(也为8位,也为2个十六进制(“ hex”)数字)。 00000000 +0 )具有十六进制值5000010000 +1 )具有十六进制值61 ,依此类推。

addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  +0123456789ABCDEF
0000  50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20   Pax is a really 
0010  63 6F 6F 6C 20 67 75 79 00                        cool guy.

0000似乎是一个地址,但可能是相对地址(或偏移量)。 此输出似乎表明

addr            value
0000+0 (0000)   0x50  
0000+1 (0001)   0x61
0000+2(0002)    0x78 
  ....

是的,可以将0000视为地址。 关于在0000 “存储”什么,具体地,值50存储在那里,在0001 ,值61被存储,并且不停地打开。

但是,对于更高级别的数据结构(例如16位整数或32位整数或字符串,甚至是记录结构),“存储在0000 ”的答案变得更加混乱。

如果对于Intel体系结构,将16位二进制整数存储在0000 ,则该值为6150或十进制24912。 这是因为Intel是“ little endian”的,并且后来在地址空间中存储了最高有效字节。 对于“大端”处理器,该值为十进制5160或20832。

现在,可以使用二进制编码的十进制编码,在这种情况下,该值将是十进制的6150或5160(取决于字节序)。

因此,您可以看到,即使对于整数这样的简单对象,也可以通过不同的方式将其存储在内存中。

因此,在字节级别,答案非常简单。 除此之外,还取决于如何以字节级别表示存储的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM