A 級計算機 2009/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。
請注意,只有當數字被指定為 **帶符號** 時,才使用最高位作為符號位。如果數字是 **無符號** 的,則最高位為正數。
要找出補碼的數值,我們必須首先記下它的符號位(最高位,最左邊的位)。如果是 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,儘管它代表的是完全相同的數字。當你不用擔心一個數字佔用多少字元時,這可能是可以接受的,但在二進位制和計算機中,數字佔用的空間非常重要,我們需要儘可能高效的表示法。對於固定數量的位,規範化的數字表示將以儘可能高的精度顯示數字。你必須確保你的規範化不會改變尾數的符號。取一個二進位制浮點數
我們可以看到這個數字以開頭。為了將其規範化,我們需要將其更改為。為此,我們需要將小數點向右移動一位,併為了保留非規範化數字所代表的相同數字,我們需要相應地更改指數。當我們向右移動一位來規範化數字時,我們需要將指數更改為向左移動一位以進行補償。因此,從當前指數中減去一。
要確保你已正確規範化,請檢查
讓我們嘗試一個更復雜的例子
為了使尾數規範化,我們需要將小數點向右移動兩位。為了保持與原始浮點數相同的值,我們需要將指數調整為減小兩位。
現在檢查新的規範化值是否與原始值相同。