【问题标题】:Computer only has 32 bits of memory addresses, but has 16GB of ram installed and working?计算机只有 32 位的内存地址,但安装了 16GB 的内存并正常工作?
【发布时间】:2021-04-15 09:45:47
【问题描述】:

我刚开始学习 C++,很惊讶地发现,在调用 &varname 时,我得到了一个 8 位十六进制数字长的数字。 假设这个数学是正确的:

2^(8 hexits x 4 bits hexit^-1) x 1 字节地址^-1 = 4.29497e+09 字节 RAM 可寻址

我应该只能处理 4GB 的内存,但我的电脑有 16GB,所有这些都可以工作。这是否意味着我的计算机实际上每个内存地址有 32 位存储空间?

【问题讨论】:

  • 你的程序运行在 32 位模式,你的操作系统运行在 64 位模式。
  • 这与 c++ 有什么关系?
  • 32 位可执行文件只能访问 4GB,但如果操作系统是 64 位,则多个进程可以每个使用 4GB。 64 位程序可以访问超过 4GB,但只能在 64 位操作系统上运行。这就是为什么很多软件都有 32 位和 64 位版本的原因。
  • when calling &varname, I got a 8 hex-digit-long number 你到底打什么电话?请张贴代码。请注意,1 的位数与 0x0000000001 一样多。
  • 如果幸运的话,您可以使用 32 位获得 4 GB。我能想到的一个主要操作系统将您限制在 2 GB,可能是因为所有傻瓜都使用 ints 作为指针,反之亦然。

标签: c++ windows


【解决方案1】:

可能性一:你的程序编译为 32 位,而你的操作系统是 64 位。

可能性 2:您的程序是为 32 位编译的,而您的操作系统是 32 位的,支持 AWE,实际上可以映射所有 16 GB,但不能映射到所有进程。编辑:现在知道操作系统是 Windows,唯一可以真正做到这一点的 Windows 版本是 Windows Server 2003 x86 Datacenter Edition。

可能性 3:您的程序是为 32 位编译的,而您的操作系统是 32 位的,并且只使用底部的 4GB。

共同点是你的程序是为 32 位编译的。

但是有一种可能性 4:您用于输出指针的任何方法都丢弃了前导零。这很不自然,但可以这样写。

【讨论】:

  • 可能性 1 是我的情况。在 Visual Studio 中,我选择了 x86 而不是 x64,认为这意味着 x86 指令集,而不是 32 位模式。 (我会在 7 分钟内接受这个答案)。
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多