8.1 記憶體
記憶體 (RAM, 隨機存取記憶體) 是一個由許多記憶體單元組成的陣列,每個單元都有一個獨特的地址。這些單元可以存儲各種類型的數據,比如數字、字符和指標。當程序執行時,它將其數據和指令放置在此記憶體中以便快速訪問。
記憶體單元示例:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
每個單元有其序號,也被稱為記憶體單元的地址或簡稱地址。如果你的電腦有8 GB的內存,那麼它就有80億個這樣的單元,可以用來存儲一些有用的東西。
比特與位元組
每個單元可以存儲一個位元組的信息。每個位元組由8個比特組成,每個比特只能包含0或1。示例(對於正整數):
數字 | 比特表示 | 四捨五入至位元組 |
---|---|---|
0 | 0 | 00000000 |
1 | 1 | 00000001 |
100 | 1100100 | 01100100 |
1000 | 1111101000 | 00000011-11101000 |
1000 000 000 | 111011100110101100101000000000 | 00111011-10011010-11001010-00000000 |
變數佔用的位元組越多,能存儲的值越多。舉例說明:
- 1個位元組— 256個唯一值
- 2個位元組— 65千個唯一值
- 3個位元組— 16百萬
- 4個位元組— 40億
8.2 資料如何在記憶體中表示
數據類型及其表示
數值數據 在處理器內部和記憶體中
- 整數:以二進制形式存儲。大小可以有所不同(1個位元組、2個位元組、4個位元組)。
- 浮點數:以浮點格式存儲(例如,IEEE 754格式的4位元組和8位元組數字)。
x = 42 # 整數
y = 3.14 # 浮點數
重要! 在 Python 中,內建類型 int
和 float
是完整的類,可以實現無限長數字的複雜計算。然而,如果你使用科學計算或人工智慧的庫,你將會遇到我上面提到的數據格式。
字符數據 在電腦記憶體中
字符和字符串在記憶體中以位元組序列的形式存儲。例如,在ASCII
編碼中,每個字符佔用1個位元組,而在UTF-8
編碼中,可以佔用1到4個位元組。
在 Python 3.x 中,字符串默認使用UTF-8
編碼,但你可以讀取以其他格式存儲文本的文件或在網絡上不以UTF-8
編碼傳輸數據。
示例:
char = 'A' # 字符
string = "Hello, world!" # 字串
Python中的單個字符沒有自己的類型——它們也使用str
類型。然而在記憶體中,這些字符串以字符為單位存儲。通常一個字符佔用1到4個位元組。
指標
指標存儲其他記憶體單元的地址
。它們允許程序處理動態數據結構並更有效地管理記憶體。
示例:
list = [1, 2, 3, 4] # 列表
list_pointer = id(list) # 指向列表開頭的指標
8.3 在記憶體中數據表示的示例
1. 整數表示
整數以二進制數(比特)形式存儲在記憶體中。根據數據類型,它們可以佔用不同數量的位元組。例如,int
通常佔用4個位元組(32位)。
這是數字42在記憶體中的表示方式:
00000000 | 00000000 | 00000000 | 00101010 |
2. 浮點數表示
浮點數(例如,float
類型)以浮點格式存儲,通常是IEEE 754
標準。float
通常佔用4個位元組(32位),而double
則佔用8個位元組(64位)。
重要!這是標準的數據類型,與記憶體和處理器綁定。Python中的float
類型對應於通常的double
類型,佔用8個位元組。
這是數字3.14在記憶體中的表示方式:
01000000 | 01001000 | 11110110 | 01100110 |
3. 字符和字符串表示
字符(例如,char
類型)以位元組序列的形式存儲在記憶體中。字符串是字符的陣列。在 C/C++ 語言中,字符串以零位元組 (\0) 結束,但是在 Python 中不是這樣。
這是字符串Hello
在記憶體中的表示方式:
'H' | 'e' | 'l' | 'l' | 'o' |
這進一步將表示為0和1:
01001000 | 01100101 | 01101100 | 01101100 | 01101111 |
8.4 動態記憶體的地址
動態記憶體在程序執行期間根據需要分配和釋放。您在 Python 中創建的所有對象都在此記憶體中創建。
它分為兩種類型:
堆 (Heap): 用於分配動態對象的記憶體區域。通過分配函數(例如,C 中的 malloc)和釋放函數(例如,C 中的 free)來管理此記憶體。
棧 (Stack): 用於存儲本地變數和函數調用數據的記憶體區域。當進入和退出函數時,記憶體會自動分配和釋放。
再次,我無法用 Python 語言舉例說明,因為它對這些操作來說太高級了。我可以再舉一個 C 語言的例子:
// 為10個整數的陣列動態分配內存
int *dynamic_var = (int *)malloc(sizeof(int) * 10);
// 釋放內存
free(dynamic_var);
記憶體地址化 是為每個記憶體單元分配唯一地址的過程。每個地址指向記憶體中的特定位置,可以包含數據或指令。
地址類型
物理地址化:直接訪問記憶體單元的物理地址。由硬件(例如,記憶體控制器)管理。
虛擬地址化:使用如頁面記憶或分段記憶這樣的記憶管理機制,為進程提供隔離和保護的地址空間。
GO TO FULL VERSION