單元 1.4.1 資料型別
當我們儲存資料時,我們為它分配一個特定的型別。我們用於資料片段的型別會影響我們如何儲存和處理它。
你需要了解以下型別。
| 型別 | 描述 | 例子 | |||
|---|---|---|---|---|---|
| 整數 | 一個整數(不是分數,沒有小數點) | 3 | -12 | 17 | 0 |
| 實數 | 有小數部分或分數的數字 | 17.4 | 3.14 | -4.8 | 0.05 |
| 字元 | 單個字母、數字或其他字元 | 4 | y | J | % |
| 字串 | 多個字元的執行 | aj%kD | Matt | bar | 12three |
| 布林值 | 兩種狀態之一(開或關) | 真 | 假 | ||
數字可以用多種進製表示,人類碰巧在使用數字時使用十進位制(或十進位制)。
讓我們以數字 184 為例。我們可以把它分成單位、十位和百位,如下所示
| 100 | 10 | 1 |
|---|---|---|
| 1 | 8 | 4 |
我們放在單元格中的是我們要將列加多少次才能得到我們的數字。在這裡,我們想要一個百位,八個十位和四個一位。
我們可以看到,每列都增加 10 的倍數,這是我們表示數字的進位制。
讓我們看看如何在二進位制(二進位制)中工作,以數字 14 為例。
- 2 的最高次方,適合 14 是 8 (23),.
- 2 的最高次方,適合 6 是 4 (22),.
- 這讓我們剩下 2,這是我們的其中一列。
這給了我們 14 的二進位制形式。
| 8 | 4 | 2 | 1 |
|---|---|---|---|
| 1 | 1 | 1 | 0 |
在上面的示例中,我們使用了 4 位(即我們有 4 列,我們可以填充它們來表示該數字)。與十進位制一樣,更大的數字需要更多的列,因此在接下來的示例中,我們將使用 8 位。
從數字 215 開始。
因此,215 可以寫成 .
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
用二進位制表示負數是一個更復雜的過程,因為我們需要一種方法來知道一個數字是負數還是正數,而只能使用 1 和 0,而不將其與數字本身混淆。有兩種主要方法用於表示這些數字:符號和大小以及補碼
這是在二進位制中表示負數的最簡單方法,它只涉及使用數字的第一位來表示該數字是負數還是正數。如果數字為負,則它為 1,否則為 0。
例如
| 數字 | 二進位制 |
|---|---|
| 67 | 01000011
|
| -67 | 11000011
|
然而,這在用這些數字進行算術運算時也給我們帶來了一些問題,因為如果我們把 67 和 -67 相加,我們應該得到 0。然而,如下所示,情況並非如此。
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | |
| + | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
| = | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
| 進位 | 1 | 1 | 1 | 1 |
這等於 6,由於溢位導致丟失一位。這意味著符號和大小不能自動進行計算,數字必須在使用之前解碼。
補碼是另一種表示負數的方法,旨在解決這個問題。轉換數字的方法稍微複雜一些,但它更強大。如果我們要表示數字 -67,就像上面一樣,我們遵守以下步驟
- 在數字前面新增若干空位,以常規二進位制表示數字
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
- 對數字取反(將所有 1 轉換為 0,將所有 0 轉換為 1)
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | |
| 反轉 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
- 將數字加 1
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | |
| + | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| = | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
就是這樣。現在該數字以補碼形式表示 -67。
使用補碼的主要優點之一是能夠在不進行轉換的情況下進行數學運算。如果我們以 67 加 -67 為例
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | |
| + | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
| = | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 進位 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
因此等於 1,由於溢位導致丟失一位。這對於常規減法(將正數加到負數以模擬減法)也適用。因此,這在更常見的情況下使用,並且可以更容易地實現。
用二進位制表示小數比負數更復雜,因為我們需要以某種方式儲存小數點的位置,同時還要保持我們得到的數字和精度。您需要了解的這種方法是標準化浮點表示。
這種方法對系統上儲存的所有小數使用標準格式。它使用類似於我們使用科學記數法表示數字的方法(345.54 變為 ),透過將小數點定義在第一位和第二位之間,並存儲數字移動了多少位。數字本身稱為尾數,具有固定位數,移動的位數稱為指數,同樣具有固定大小。
使用這種方法時需要注意的一點是,您必須清楚地瞭解用於儲存數字每一位的位數。當處理非常大的數字或具有很多小數位的數字時,這一點變得非常重要,因為您將開始遇到精度丟失的錯誤(浮點錯誤)。
要以標準形式表示小數,我們使用之前用過的列,但在 1 列的右側,我們新增一個小數點,並使用 形式繼續列。
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | . | |||
|---|---|---|---|---|---|---|---|---|---|---|---|
從這裡我們可以直接表示我們的數字。對於這個例子,我們將表示數字 47.625。整數部分可以像往常一樣表示為 ,小數部分可以表示為 。
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | . | |||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | . | 1 | 0 | 1 |
所以現在我們有了數字,但我們永遠無法將它儲存在裝置上,因為我們在中間有一個小數點。這就是浮點概念的來源。我們需要找到二進位制中數字第一次變化的位置。這意味著數字從 0 變為 1 或反之的第一點。然後我們在這兩個值之間放置小數點,並記錄我們移動了多少位小數點。
| 128 | 64 | . | 32 | 16 | 8 | 4 | 2 | 1 | |||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | . | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
| . | ← | ← | ← | ← | ← | ← |
我們將其放置在 64 和 32 之間,因為這是數字中從 0 變為 1 的第一次變化,現在它是標準化形式。然後我們將它向左移動了六位。在這個例子中,我們將使用 10 位尾數和 6 位指數(儲存在 16 位暫存器中)。使用標準化形式時,我們只取虛數小數點前的一位數字,然後在數字的右側使用 0。這意味著我們在這裡表示的數字在使用 10 位時變為 01011111010。然後我們將它向左移動了 6 位,這意味著正向移動了 6 位。這是 6 位二進位制中的 000110。
然後我們可以將數字附加在一起
01011111010000110
這成功地在標準化浮點中表示了小數 47.625。這種方法也可以與補碼結合使用來表示負小數,它可以用來表示非常小的數字,例如 0.00005,但是,您必須記住,向右移動是負數,向左移動是正數。
就像十進位制加法一樣,我們將兩個數字的列對齊,然後從右邊開始新增值。
- 1 加 1 等於 2(因此有 0 個 1 和 1 個 2),所以 1 的列為 0,並將 1 進位到 2 的列。
- 1 加 0 加 1 等於 2,所以設定為 0,並再次進位。
- 1 加 1 加 1 等於 3,所以設定為 1,並進位。
- 0 加 0 加 1 等於 1。
- 1 加 1 等於 2,所以設定為 0,進位 1。
- 0 加 0 加 1 等於 1。
- 1 加 0 等於 1。
- 1 加 0 等於 1。
上面的計算過程可以在表格中更加清晰地看到。
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | |
| + | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
| = | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
| 進位 | 1 | 1 | 1 | 1 |
檢查十進位制結果:
十六進位制是另一種在計算機中經常使用的數字表示形式。它主要用於表示比二進位制或十進位制更大的數字,但使用更少的位數(儘管它始終以二進位制形式儲存在計算機記憶體中)。
十六進位制是 16 進位制的名稱,這意味著我們使用 16 個字元來表示數字。由於我們只有 10 個數字,所以我們使用字元 A、B、C、D、E 和 F 來分別表示 10、11、12、13、14 和 15。
在 16 進制中表示十進位制數時,我們使用與二進位制相同的規則;但是,我們不能將列寫成 2 的冪,而是寫成 16 的冪。例如,要將 7652 表示為十六進位制,
- 4096 () 可以進入 7652 一次,這意味著我們在該列中放置一個
1,現在還剩下 3556。 - 256 () 可以進入 3556 13 次,這意味著我們在該列中放置一個
D,現在還剩下 228。 - 16 () 可以進入 228 14 次,這意味著我們在該列中放置一個
E,現在還剩下 4。 - 1 () 可以進入 4 4 次,這意味著我們在該列中放置一個
4,現在還剩下 0。
| 4096 | 256 | 16 | 1 |
|---|---|---|---|
| 1 | D | E | 4 |
因此,7652 在十六進位制中為 1DE4。
將二進位制直接轉換為十六進位制實際上是一個簡單的過程,不需要一次性將整個二進位制數轉換為十進位制。相反,在進行這種轉換時,我們只需將二進位制數按每 4 位(一個位元組)為單位轉換為十進位制,然後轉換為十六進位制。如果我們有二進位制數 156(10011100),我們可以將其放入表格中並寫出正確的標題,如所示:
| 8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
| = 9 | = 12 | ||||||
| = 9 | = C |
因此,該數字在十六進位制中為 9C。
位操作是指對二進位制數的位進行的一系列特定操作。規格說明中需要了解的操作包括:移位、與、或和異或。一旦理解了,這是一個非常快速簡便的主題。
二進位制暫存器可以向左或向右移位,顧名思義,它只是將二進位制位向一個方向移動。在大多數情況下,任何產生的空格將用 0 填充。
左移將暫存器的內容移到左邊,並丟棄任何不再適合暫存器的位。此功能很重要,因為它相當於將一個數字乘以 2。在此示例中,我們將使用值為 54 的值:
因此,如果我們在保持最大大小為 8 位的情況下進行左移(通常用字元 << 表示)
00110110 << 1 = 01101100 = 108
00110110 << 2 = 11011000 = 216
00110110 << 3 = 10110000 = 176
正如您在最後一個示例中看到的,當我們移位 3 位時,第一個位被“推出”暫存器並丟失了。在使用左移時,這是一個重要的考慮因素,因為我們必須注意何時會丟失潛在的重要位。在前兩個示例中,您可以看到每次左移都等於將原始十進位制數乘以 2 的冪。左移一位乘以 2,左移兩位乘以 4。如果我們使用更大的暫存器,則左移三位將使我們得到原始值乘以 8。
此功能通常用於將數字相乘,因為它可以分解為乘以 3 的冪,然後將原始數字加若干次。例如,將一個數字乘以 5 等於左移兩位(乘以 4),然後再次加上原始數字。
毫不奇怪,右移與左移相反,而是將暫存器的內容移到右邊。本節不會詳細介紹,因為您應該已經瞭解移位的基本原理以及如何使用它。
如果我們在保持最大大小為 8 位的情況下進行右移(通常用字元 >> 表示)
00110110 >> 1 = 00011011 = 27
00110110 >> 2 = 00001101 = 13
00110110 >> 3 = 00000110 = 6
從第二個示例中,下溢錯誤的影響立即顯而易見。
您可能沒有完全瞭解 與門,因為這在單元 1.4.3 中出現,但是您應該能夠猜到。如果兩個輸入都為 1,則與門返回 1 值。
與可以用作位運算子,將兩個二進位制暫存器或二進位制值進行與運算。例如,如果我們有兩個暫存器 01101000 和 01000010,我們可以進行
01101000 & 01000010 = 01000000
此操作的一個應用是確定一個數字是否能被 2 整除。如果我們將任何值與二進位制值 1 進行與運算,它將只留下最低有效位(最後一位)。如果這個數字大於 0,則它是奇數,否則它是偶數。
或門如果兩個輸入之一為 1,則返回 1 值。這可以用作位運算子,將兩個值進行或運算。為了使用上面的示例
01101000 | 01000010 = 01101010
此操作的一個應用是在二進位制數中儲存一系列真值或假值,例如對於非常簡單的控制程式。如果使用者想在系統尚未啟用時啟用它,他們可以將儲存狀態的暫存器的內容與在對應於設定的位置包含 1 的二進位制數進行或運算。結果值將包含原始設定,如果該位尚未設定為 1,則該位將設定為 1。
異或門是或門的修改版本,如果兩個輸入之一為 1,則返回 1,但如果兩個輸入都為 1,則返回 0。為了使用上面的示例
01101000 ^ 01000010 = 00101010
這可以再次應用於控制系統以切換設定,因為如果該位當前在暫存器中關閉,它將被啟用,但如果它處於開啟狀態,它將被切換到關閉狀態。
表示是一個相對簡單的過程,它使用數字來表示符號。雖然過程本身很簡單,但實現實際上可能更復雜。為了使多臺機器能夠通訊文字,它們必須有一個標準來定義哪些數字用於哪些字元。這些標準稱為字元集,在字元的定義方式和可用的大小方面差異很大。
有許多不同的字元集在不同的地方被實現,系統甚至可以使用多個字元集,只要它們知道當前使用的是哪一個。您可以檢視 此處 的常見字元集列表。但是,您只需要知道兩種字元集的存在:ASCII 和 Unicode。

ASCII 代表美國資訊交換標準程式碼。它是在 1963 年定義的,是使用最廣泛的編碼之一。它預設使用 7 位來表示字元,這使得最多可以表示 128 個字元。此標準還有一些擴充套件,例如擴充套件 ASCII,它使用 8 位來表示字元,從而增加了可能的選項。側邊顯示了所有 ASCII 程式碼及其對應十進位制值的表格。當文字使用此編碼進行編碼並存儲時,每個十進位制數字都以二進位制形式表示並存儲。

Unicode 的功能與 ASCII 相同,但它在用於儲存字元的位數上有所不同。Unicode 有多個子集,具有不同的字元數,例如 UTF-8、UTF-16 和 UTF-32。最新的 Unicode 標準(截至撰寫本文時)有 128,237 個可能的字元。它已成為系統的最新標準,並在構建新系統時使用,以便適應更廣泛的字元和語言。
側邊顯示了一個影像,顯示了一部分可能的 Unicode 符號。您可以在維基百科的 Unicode 頁面上閱讀有關 Unicode 的更多資訊。