我的64位计算机每个内存位置只能存储4个字节。

3

我的电脑是64位的Mac。

每个内存位置存储多少字节的信息?

当我在gdb中尝试某些操作时

x /2x first
0x7ffff661c020: 0xf661b020      0x00007fff 

我的代码是

#define PUT(p, val) (*((size_t *)(p)) = (val))
PUT(first, (size_t)some pointers);

我使用gcc -g进行编译。

似乎只有4个字节存储在0x7ffff661c020中。0x00007fff存储在0x7ffff661c024中。为什么不能将0x00007ffff661b020存储在0x7ffff661c020中呢?

谢谢。

2个回答

8
每个内存位置只能存储8个位,因为内存是按字节寻址的。64位机器并不意味着每个内存位置都有64位,它只是表示一次可以处理64位。
例如,寄存器宽度为64位(除非你故意操作子寄存器如ax或eax而不是64位的rax),你可以用单个指令从内存中加载那么多位。
你可以看出它是按字节寻址的,因为你的两个地址之间相差四个。
0x7ffff661c020: 0xf661b020
0x7ffff661c024: 0x00007fff
              \____________/ four-byte
                           \ difference

如果您使用的是基于字节的输出,您将会更自然地看到它,例如:

(gdb) x/8xb first
0x7ffff661c020: 0x20 0xb0 0x61 0xf6 0xff 0x7f 0x00 0x00

因此,在0x7ffff661c020地址处的64位值实际上是预期的0x00007ffff661b020,您只需要调整gdb命令以获取完整的64位值,类似于:

x/1xg first

这里的1xg表示一个值,十六进制格式,巨型字(8个字节)。有关x命令的详细信息可以在此处找到,对于您的问题,重要的部分是单位大小的描述(我用粗体标出):

  • b = 字节。
  • h = 半字(两个字节)。
  • w = 字(四个字节)。这是初始默认值。
  • g = 巨型字(八个字节)。

谢谢,真的很有帮助。我甚至怀疑我的代码完全错误了。 - Seawind Shi
小问题,现在有一些处理器不是“字节寻址”的,它们往往是嵌入式处理器(例如DSP),其中一个旋转桶是一个相当大的硅片(例如乘以一千个处理器)。 - user3710044

3
似乎只有4个字节存储在0x7ffff661c020中。
不是的:您已要求GDB提供存储在位置0x7ffff661c020处的4个字节,因此它确实给了您。请尝试使用以下内容:
(gdb) x/gx 0x7ffff661c020

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接