2015-05-22 64 views
1

當運行在64位計算機上的代碼:爲什麼32和64位的地址有兩種不同的長度?

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

它輸出:

0x7fffe9ebf984 (14 digits) 

在教科書我發現這一點:

我的電腦的存儲器地址是32位並代表八位 十六進制數字。

我的問題是:

爲什麼在32位和64位的地址,兩種不同的長度?

8位數字是如何用來表示32位的地址和64位的14位的?

+0

看起來像12位數字,但可能有前導零。處理器內存地址大於32位,但可能小於64位,具體取決於處理器。 – rcgldr

+0

'printf(「%p」,&a);'不需要打印所有前導'0'數字,'0x7fffe9ebf984'也暗示連續線性內存範圍爲0到'0x7fffFFFFFFFF'。好奇的是,printf(「%p」, NULL);'? – chux

回答

2

首先要說的是: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個內存(實際上,可用內存的數量更小!)。

對於今天的許多應用,例如大的in-memory databases,4 GiB的虛擬內存太小而無法容納數據集。這促使引入了64位機器,例如基於x86-64架構的機器。理論上,64位機器應該能夠處理16個EiB。但是,正如其他人所指出的那樣,x86-64架構目前通過要求虛擬地址大小爲canonical form,將虛擬地址大小限制爲48位。

順便說一下,規範地址空間下部的地址可以使用12個十六進制數字寫入。像往常一樣,打印時我們省略了前導零。

我們很可能不久就會看到從32位到64位計算的完整轉換。仍然有許多應用程序,特別是在嵌入式系統中,64位地址所支持的內存數量根本不需要;的確,16位甚至8位微控制器仍然很常見。

4

該內存地址有12個數字,而不是14個。每個數字是一個4位字。 12 * 4 = 48,這是一個256兆字節的地址空間。當前的CPU只使用完整64位地址空間的低48位,因爲這樣可以構建更便宜的晶體管(我們不會完全使用我們可以在不久的將來使用64位的內存)。當我們達到48位限制時,製造商可能會創建真正使用64位完整地址空間的CPU,但現在這不是必需的。

+0

所以在0x7fffe9ebf984中,實際地址是7fffe9ebf984? 這意味着我們沒有考慮0x? –

+0

0x只是告訴你這個數字是十六進制的,真正的地址是7fffe9ebf984。 –

1

你有32位和64位地址的原因必須處理CPU體系結構。較舊的CPU使用32位,但使用32位地址將您限制爲4GB的系統內存。這就是爲什麼要更改爲64位地址。該系統可以支持更多的地址,因此可以支持更多的RAM。

你的號碼中的「0x」只是告訴你它是十六進制。所以它實際上是12位數字,其中每個數字是4位(總共48位)。

+1

Nitpick: 32位地址長度限制* virtual *地址空間。物理內存可能更大,例如使用[PAE](http://en.wikipedia.org/wiki/Physical_Address_Extension)。 –

+2

注意:當前嵌入處理器(每年數十億美元)只能使用16位地址空間 – chux

+0

同意這兩個方面,當我學會彙編時,人們正在討論可移植性在16到32位之間。 –

相關問題