1. 程式人生 > >關於內存地址和內存空間的理解(轉)

關於內存地址和內存空間的理解(轉)

假設 分享 十六進制 可能 一行代碼 code 註意 門牌號 個人理解

1.內存地址用4位16進制和8位16進制表示的區別。例如經常可以看到某些書籍上寫的內存地址0x0001,在另外一些書籍上寫的內存地址又變成了0x00000001。都是表示的編號為1的內存地址,為什麽一個是4位16進制表示,另外一個又是用8位16進制表示呢?

首先,必須要知道內存地址只是一個編號,代表一個內存空間。那麽這個空間是多大呢?原來在計算機中存儲器的容量是以字節為基本單位的。也就是說一個內存地址代表一個字節(8bit)的存儲空間。

例如經常說32位的操作系統最多支持4GB的內存空間,也就是說CPU只能尋址2的32次方(4GB),註意這裏的4GB是以Byte為單位的,不是bit。也就是說有4G=4*1024M(Byte)=4*1024*1024Kb(Byte)=4*1024*1024*1024bit(Byte),即2的32次方個8bit單位。

所以說用4位16進制表示的內存地址和用8位16進制表示的內存地址,其實都是代表一個8bit的存儲空間而已:

技術分享圖片

技術分享圖片

至於說為什麽會出現一種是用4位十六進制表示內存地址,另一種用8位十六進制表示內存地址,那是根據不同的硬件環境來的。個人理解:有些CPU只能尋址16位(16根地址線),所以用4位十六進制表示地址就夠用了。有些CPU只能尋址32位(32根地址線),所以用8位十六進制。

另外記住, 210 = 1024

1G = 1024 M

1M = 1024 Kb

1Kb = 1024 bit

2.理解內存。

程序和數據平常存儲在硬盤等存儲器上,不管你開機或關機了,它們都是存在的,不會丟失。硬盤可以存儲的東西很多,但其傳輸數據的速度較慢。所以需要運行程序或打開數據時,這些數據必須從硬盤等存儲器上先傳到另一種容量小但速度快得多的存儲器,之後才送入CPU進行執行處理。這中間的存儲器就是內存。

無論何種存儲器,軟盤、硬盤、光盤或者內存,都有地址。因為它們要存儲數據,所以就必須按一定的單位的數據分配一個地址。有了地址,程序才能找到這些數據。這很好理解,想想你們家為什麽要有門牌號即可。

學習編程,必須對內存的地址有一個透徹的理解。我們編程中的每一行代碼,代碼中用到的每個數據,都需要在內存上有其映射地址。當然,我們並不需要掌握內存是如何進行編址,那是計算機系中的另外一門課:操作系統的事了。

內存地址:
計算機把所有的信息都給數字化了,所以它知道自已把一個數據,一條命令記到了內存中的哪個(些)位置。
看下面的例子:
如果讓計算機在內存裏記住“丁小明”這個名字,可以示意為:

技術分享圖片

在第一行中,每一格表示一段內存,而格子裏的內容是這段內容記下的數據;第二行中每一格內數字就是對應的內存的地址。
可能有人會啄磨:為什麽一個“丁”字(“小”“明”兩字也一樣)占用兩個內存地址呢?這是因為漢字在一個地址(位置)裏呆不下,必須放在連續的兩個地址空間內。那麽,什麽東西可以放在單獨的一個內存地址裏呢?像英文的裏字母,比如’A’, 像阿拉伯數字:比如’1’,可以,而且就是放在一個內存地址裏。假設有一字符串“ABC”,被記在內存裏,可示意為(這次我們假設從內存地址2000H處記起):

(註:原文這裏應該是在說unicode 所以是兩個字節

現在我們提幾個問題:

計算機記住”丁”字的內存地址是多少? 答案是:1000H。請見上圖

我們一直在說,在計算機中,所有信息都被數字化為2進制的0、1,所以,“丁小明”這個名字被也應該是一串:0001 0010 0111 0101……,可是在中圖所畫出的,計算機內存裏記的,仍是“丁小明”三個字啊。

下面是解釋,我們只舉一個字”丁”講解。我們假設在那一串裏的 0001 0010 0111 0101 對應的是 “丁” 字,那麽有:

技術分享圖片

讓我們把字母’A’對應的圖也畫出來:

技術分享圖片

在上面的兩個圖中:

第一行分別是“丁”和“A”,它是給人看的。

第二行則是一串的的0和1,這才是計算機內存中實際存儲的數據。

第三行是內存的地址。並不是每個0和1所占的位置都被編上地址。而是每8個才擁有一個地址。

關於第三行,你可以這樣理解,門牌號是一個家庭分配一個,每家每戶內還有客廳臥室,這些就沒有地址了。

可見:

‘丁’的確是由一串0、1組成的。更確切地,從圖上可以看出‘丁’是由16位0和1組成。這16數都存放在2個內存地址裏。

‘A’也一樣,它是由8位0、1組成的。占1個內存地址。

總結:內存地址是內存當中存儲數據的一個標識,並不是數據本身,通過內存地址可以找到內存當中存儲的數據。

關於內存地址和內存空間的理解(轉)