【问题标题】:When truncating a 64 bit address to a 32 bit address in windows, why do we need to guarantee that the high 33 bits are 0, and not the high 32 bits?windows中将64位地址截断为32位地址时,为什么要保证高33位为0,而不是高32位?
【发布时间】:2014-01-30 04:17:52
【问题描述】:

我一直在通过 Jeffrey Richter 的 C/C++ 阅读 Windows,并在有关将 32 位应用程序移植到 64 位环境的 Windows 内存架构一章中遇到了以下 sn-p。

如果系统能够以某种方式保证不会在 0x00000000'7FFFFFFF 以上进行任何内存分配,则应用程序将正常工作。当高 33 位为 0 时,将 64 位地址截断为 32 位地址不会导致任何问题。

我无法理解为什么系统需要保证在0x00000000'7FFFFFFF 而不是0x00000000'FFFFFFFF 之上没有进行内存分配。只要32 的高位是0,就可以截断地址吗?我可能遗漏了一些东西,如果有比我更了解 Windows 的人能解释为什么会这样,我将不胜感激。

【问题讨论】:

    标签: windows 64-bit


    【解决方案1】:

    并非所有 32 位系统/语言都对内存地址使用无符号值,因此第 32 位在某些情况下可能具有不同的含义。通过将地址空间限制为 31 位,您就不会遇到这个问题。此外,Windows 限制 32 位应用程序访问高于 2 GB 的地址,而无需使用特殊扩展来扩展该地址,因此大多数应用程序无论如何都不需要 32 位。

    【讨论】:

    • 啊,我明白了,我没有意识到这可能与签名有关。这就说得通了。感谢您的回答!
    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2021-01-06
    • 2021-12-10
    • 2011-12-29
    • 2012-01-22
    相关资源
    最近更新 更多