首先要說的是: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位微控制器仍然很常見。
看起來像12位數字,但可能有前導零。處理器內存地址大於32位,但可能小於64位,具體取決於處理器。 – rcgldr
'printf(「%p」,&a);'不需要打印所有前導'0'數字,'0x7fffe9ebf984'也暗示連續線性內存範圍爲0到'0x7fffFFFFFFFF'。好奇的是,printf(「%p」, NULL);'? – chux