当我在64位机器上运行此代码时:
#include <stdio.h>
int main()
{
int a[10];
printf("%p",&a);
return 0;
}
输出:
0x7fffe9ebf984 (14 digits)
在教科书中我发现了这个:
我的计算机内存地址为32位,代表八位 十六进制数字。
我的问题是:
为什么32位和64位地址有两种不同的长度?
如何用8位数表示32位地址和14位64位?
答案 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位)。