为什么32位和64位地址有两种不同的长度?

时间:2015-05-22 15:57:15

标签: c memory

当我在64位机器上运行此代码时:

‪#‎include ‬<stdio.h>
int main() 
{ 
    int a[10]; 
    printf("%p",&a);
    return 0;  
}

输出:

0x7fffe9ebf984 (14 digits)

在教科书中我发现了这个:

  

我的计算机内存地址为32位,代表八位   十六进制数字。

我的问题是:

为什么32位和64位地址有两种不同的长度?

如何用8位数表示32位地址和14位64位?

3 个答案:

答案 0 :(得分:4)

该存储器地址有12位数字,而不是14位。每个数字都是4位字。 12 * 4 = 48,这是256太字节的地址空间。当前CPU仅使用整个64位地址空间的低48位,因为这允许构建更便宜的晶体管(我们不会完全使用我们可以在不久的将来使用64位的存储器)。当我们达到48位限制时,制造商可能会创建真正使用64位完整地址空间的CPU,但现在这不是必需的。

答案 1 :(得分:3)

首先要做的事情是:0x前缀表示后面是hexadecimal(基数为16)的数字。十六进制系统扩展了十进制系统(0到9)中的数字集,其中a,b,c,d,e和f分别代表十进制数10,11,12,13,14和15。我们更喜欢十六进制数到十进制数的原因(至少在word length是四的倍数的机器上)是每个十六进制数字方便地对应于一组4位(二进制数字)。例如:

Hexadecimal: 3
Binary:      0 0 1 1
--------------------
Hexadecimal: F
Binary:      1 1 1 1

通常当我们说机器是“32位”或“64位”时,我们谈的是virtual address长度 - 也就是从视角构成内存地址的位数用户模式进程(这通常但不一定与单词长度一致。)

在x86-32计算机上,例如旧的Pentium,虚拟地址大小为32位。这意味着可以使用八个十六进制数字写入地址。例如,0x80000000表示2 GiB标记。虚拟地址为32位的事实意味着任何给定的进程只能直接引用4 GiB的内存(实际上,可用内存量甚至更小!)。

对于今天的许多应用程序,例如大in-memory databases,4 GiB的虚拟内存太小而无法容纳数据集。这促使引入了64位计算机,例如基于x86-64架构的计算机。从理论上讲,64位机器应该能够解决16 EiB。但是,正如其他人所指出的那样,x86-64架构目前将虚拟地址大小限制为48位,要求它们位于canonical form

顺便说一句,规范地址空间下部的地址可以用12个十六进制数字写入。像往常一样,我们在打印时省略了前导零。

如果有的话,我们不太可能很快看到从32位到64位计算的完全转变。仍有许多应用程序,特别是在嵌入式系统中,其中不需要64位地址支持的内存量;实际上,16位甚至8位微控制器仍然很常见。

答案 2 :(得分:1)

您拥有32位和64位地址的原因必须处理CPU架构。较旧的CPU使用32位,但使用32位地址会限制您使用4GB的系统内存。这就是为什么要更改为64位地址。系统可以支持更多地址,因此可以支持更多RAM。

你号码中的“0x”只是告诉你它是十六进制的。所以它实际上是12位数,其中每个数字是4位(总共48位)。

相关问题