A-level 計算機科學/AQA/處理和程式設計技術/計算機中的資料表示
如您所知,我們通常使用的計數系統是**十進位制**,而計算機使用的二進位制系統是**二進位制**。**十六進位制**是一種**十六進位制**數制。在十六進位制中,使用數字 0-9,就像在十進位制中一樣,但字母 A-F 也用於表示數字 10-15。下表顯示了十進位制的數字 0-16 以及它們的二進位制和十六進位制等效值
| 十六進位制 | 二進位制 | 十進位制 |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 2 | 0010 | 2 |
| 3 | 0011 | 3 |
| 4 | 0100 | 4 |
| 5 | 0101 | 5 |
| 6 | 0110 | 6 |
| 7 | 0111 | 7 |
| 8 | 1000 | 8 |
| 9 | 1001 | 9 |
| A | 1010 | 10 |
| B | 1011 | 11 |
| C | 1100 | 12 |
| D | 1101 | 13 |
| E | 1110 | 14 |
| F | 1111 | 15 |
| 10 | 10000 | 16 |
您可能會從表格中注意到,一個十六進位制數字可以準確地表示 4 個二進位制位。十六進位制對我們來說是一種簡寫二進位制的簡便方法,並且使使用長二進位制數字更容易。
由於 4 個二進位制位由一個十六進位制數字表示,因此在兩者之間進行轉換很簡單。您可以將二進位制位分組為 4 組,從右邊開始,並在需要時在左邊新增額外的 0,然後將每組轉換為它們相應的十六進位制等效值。例如,數字 110110011110101 可以這樣寫
0110 1100 1111 0101
然後透過使用上面的表格,您可以將每組 4 位轉換為十六進位制
6 C F 5。
因此,二進位制數 0110110011110101 在十六進位制中是 6CF5。我們可以透過將兩者都轉換為十進位制來檢查這一點。首先我們將轉換二進位制數,因為您已經知道如何做到這一點
| 32768 | 16384 | 8192 | 4096 | 2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 |
透過將各列相乘,然後將結果相加,答案是 27893。
注意,列標題都是 2 的冪,, , , ,等等。為了從十六進位制轉換為十進位制,我們必須使用基數為 16 的冪作為列標題,如下所示
| 4096 | 256 | 16 | 1 |
|---|---|---|---|
| 6 | C | F | 5 |
(您應該記住 A-F 的值)
將它們全部加起來得到 27893,表明 0110110011110101 等於 6CF5。
為了從十進位制轉換為十六進位制,建議您先將數字轉換為二進位制,然後使用上述簡單方法從二進位制轉換為十六進位制。
- 注意:十六進位制使用起來比純二進位制更容易理解。它**不會**佔用更少的記憶體空間,只會佔用更少的紙張空間!
計算機純粹以二進位制方式工作。這意味著它只使用 1 和 0,而且計算機無法使用 - 或 + 符號。計算機必須以不同的方式表示負數。
我們可以透過將最高有效位設為**符號位**來表示二進位制中的負數,這將告訴我們該數是正數還是負數。一個 8 位數的列標題將如下所示
| -128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
在這裡,最高有效位是負數,其他位是正數。您從 -128 開始,按正常方式新增其他位。上面的例子在十進位制中是 -67。-1 的二進位制是 11111111。
請注意,只有在數字被指定為**有符號**時,您才使用最高有效位作為符號位。如果數字是**無符號**的,則 msb 為正數。
要找出二進位制補碼的數值,我們首先要標記它的符號位(最高位,最左邊的位)。如果為 0,則該數字為正數,如果為 1,則該數字為負數。
0000 0101 (positive) 1111 1011 (negative)
要找出負數的數值,我們必須找到並保留最右邊的 1 及其右邊的所有位,然後將它左邊的所有位翻轉。以下是一個例子:
1111 1011 find the right most one 1111 1011 0000 0101 flip all the bits to its left
現在我們可以計算出這個新數字的數值,它是
128 64 32 16 8 4 2 1
0 0 0 0 0 1 0 1
4 + 1 = −5 (remember the sign you worked out earlier!)
再來一個更復雜的例子怎麼樣?
1111 1100 find the right most one 1111 1100 0000 0100 flip all the bits to its left
128 64 32 16 8 4 2 1
0 0 0 0 0 1 0 0
4 = −4 (remember the sign you worked out earlier!)
所以我們知道如何計算一個給定的負數的數值。我們如何計算一個正數的負數版本?就像這樣……
取正數的二進位制版本
0000 0101 (5) 0000 0101 find the right most one 0000 0101 1111 1011 flip all the bits to its left
所以現在我們可以看到正數和負數之間的區別
0000 0101 (5) 1111 1011 (−5)
當涉及到用二進位制從一個數字中減去另一個數字時,事情會變得非常混亂。
X (82 denary) 0101 0010 Y (78 denary) 0100 1110 −
從 X 中減去 Y 的一個更容易的方法是將 Y 的負值加上 X 的值。
X−Y = X+(−Y)
要做到這一點,我們首先需要找到 Y 的負值
0100 1110 find the right most one 0100 1110 1011 0010 flip all the bits to its left
現在再嘗試一下加法
0101 0010 X( 82 denary) 1011 0010 + Y(−78 denary) 0000 0100 (¹)¹¹¹ ¹ the one carried over the bit 9 is ignored
結果是
128 64 32 16 8 4 2 1
0 0 0 0 0 1 0 0
4 = 4 = 82-78
到目前為止,我們只處理了整數,或者說整數。我們需要一種方法在計算機系統中儲存實數。
首先,我們應該看看十進位制中表示分數的方法之一。
| 10 | 1 | |||
|---|---|---|---|---|
| 1 | 2 | . | 7 | 5 |
正如你所見,列標題已經擴充套件到 和 。我們可以在二進位制中做同樣的事情,列標題是、 等等。因此,二進位制中的 12.75 為
| 8 | 4 | 2 | 1 | |||
|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | . | 1 | 1 |
請注意,對於小數點後的相同位數,二進位制數的精度較低。它只能取 4 個不同的值,而十進位制數可以用兩位數字進行 100 個不同的劃分。
如果你學習物理或化學等其他科目,你可能會遇到這樣的浮點數
(Planck's constant)
第一位定義了數字的非零部分,稱為尾數,第二部分定義了我們想要移動小數點的位數,這被稱為指數,當小數點向右移動時可以為正,當小數點向左移動時可以為負。
如果你想完全寫出那個數字,你就必須將小數點在指數中向左移動 34 位,結果是
這將需要很長時間來寫,而且人眼很難看清有多少個零。因此,當我們可以接受一定程度的精度(6.63 = 3 位有效數字)時,我們可以用少數位數儲存像普朗克常數這樣的大數字。你總是權衡數字的範圍(或範圍)與其精度(有效位數)。
二進位制數也是如此,這一點甚至更為重要。當你處理數字及其計算表示時,你必須始終了解這些數字在記憶體中佔用多少空間。正如我們在上面的例子中看到的,一個數字的非浮點數表示形式可能需要佔用一個不可行的位數,想象一下儲存 在二進位制中需要多少位? (別擔心,這個問題是修辭性的)
二進位制浮點數可能由 2、3 或 4 個位元組組成,但是你只需要關心 2 位元組 (16 位) 的型別。前 10 位是尾數,最後 6 位是指數。
就像十進位制浮點數表示一樣,二進位制浮點數也會有尾數和指數,但由於你處理的是二進位制 (以 2 為底),你必須記住,你需要使用 而不是 。
定點二進位制允許計算機儲存小數,但由於其性質,其範圍非常有限。即使使用 4 個位元組儲存每個數字,並將 8 位用於小數點後的分數部分,所能儲存的最大數字也只有 800 萬多一點。為了儲存非常大的數字,需要另一種格式。
在十進位制中,非常大的數字可以用尾數和指數來表示。例如 0.12²。這裡 0.12 是尾數,² 是指數。尾數儲存主要數字,指數定義小數點應該放在哪裡。
同樣的技術可以用於二進位制數。例如,可以將兩個位元組分成 10 位用於尾數,其餘 6 位用於指數。這允許使用更大的數字範圍。
在計算二進位制浮點數時,需要經過幾個步驟。實際上這就像迪斯科舞的舞步一樣 - 在此頁面上被稱為 Noorgat 舞,Kemp 變奏(但你不會被測試名字,但它應該幫助你記住)
- 符號 - 找到尾數的符號 (記下來)
- 滑動 - 找到指數的值,以及它是正數還是負數
- 反彈 - 根據指數的要求移動小數點,負指數向左移動,正指數向右移動
- 翻轉 - 如果尾數為負,則對其執行二進位制補碼操作
- 游泳 - 從小數點開始計算尾數的值。現在確保你參考你在符號步驟中記錄的符號。
讓我們試試。我們給定以下 16 位浮點數,其中 10 位用於尾數,6 位用於指數。記住小數點位於第一位和第二位有效位之間
我們需要執行的第一個操作是符號,找出指數的符號
It is 0 so the mantissa is positive
Noorgat 舞的第二步是滑動,我們需要找到指數的值,即數字的最後 6 位
So we know that the exponent is of size positive one and we will have to move the decimal point
one place to the right.
Noorgat 舞的第三步是反彈,即根據滑動的指示將尾數的小數點移動指定的位數,即向右移動一位。就像這樣
第四步是可選的翻轉。回到符號步驟,檢視尾數是否為負數。不是嗎?好吧,你可以跳過這一步,因為我們只在尾數為負數時翻轉數字。
第五步也是最後一步是游泳。單獨考慮尾數,現在我們可以計算出浮點數的值。從中間開始,將左側的每個數字標記為 等等。右側的每個數字 等等。
Voila! the answer is 1
規範化數字
[edit | edit source]在處理二進位制浮點數時,必須確保前兩位不同。也就是說
絕對不
這是因為我們必須確保我們使用的空間被最有效地使用。例如,如果我們取一個十進位制浮點數,例如
(Planck's constant)
如果我們把它改寫為
(Planck's constant)
那麼你可以看到表示形式多佔了 2 個字元,即兩個額外的 0,即使它代表完全相同的數字。當你不關心數字佔用了多少字元時,這可能是可以接受的,但在二進位制和計算機中,數字佔用的空間非常重要,我們需要最有效的表示形式。對於固定數量的位,數字的規範化表示形式將以儘可能高的精度顯示數字。你必須確保你的規範化操作不會改變尾數的符號。 考慮一個二進位制浮點數
我們可以看到數字以 開頭。我們需要把它改成 才能使其規範化。為此,我們需要將小數點向右移動一位,並且為了保持與非規範化數字表示的相同數字,我們需要相應地更改指數。如果將小數點向右移動一位以規範化數字,我們需要將指數更改為向左移動一位以補償。從而從當前指數中減去 1。
為了確保你已正確規範化,請檢查
讓我們嘗試一個更復雜的例子
為了使尾數規範化,我們需要將小數點向右移動兩位。為了保持與原始浮點數相同的值,我們需要將指數調整為小 2。
現在檢查新的規範化值是否與原始值相同。