資料表示基礎:補碼
幾乎所有計算機都完全使用二進位制。這意味著它們只使用 0 和 1,而且計算機沒有 - 或 + 符號。計算機必須以不同的方式表示負數。
我們可以透過將最高有效位 (MSB) 設定為 **符號位** 來表示二進位制中的負數,符號位將告訴我們數字是正數還是負數。8 位數字的列標題將如下所示
| -128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| MSB | LSB | ||||||
| 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
這裡,最高有效位是負數,其他位是正數。您從 -128 開始,像往常一樣新增其他位。上面的例子是十進位制的 -67,因為:(-128 + 32 + 16 + 8 + 4 + 1 = -67)
-1 的二進位制表示是 11111111。
請注意,只有在數字被指定為 **有符號** 的情況下,您才將最高有效位用作符號位。如果數字是 **無符號** 的,則無論它是 1 還是 0,msb 都是正數。
|
有符號二進位制數 如果 MSB 為 0,則數字為正,如果為 1,則數字為負。 0000 0101 (positive) 1111 1011 (negative) |
|
方法:將負十進位制數轉換為二進位制補碼 假設您想將 **-35** 轉換為二進位制補碼。首先,找到 35(正數)的二進位制等效值 32 16 8 4 2 1 1 0 0 0 1 1 現在在 MSB 之前新增一個額外的位,將其設定為 0,得到 64 32 16 8 4 2 1 0 1 0 0 0 1 1 現在將所有位“翻轉”:如果它是 0,將其改為 1;如果它是 1,將其改為 0 64 32 16 8 4 2 1 1 0 1 1 1 0 0 這個新的位表示 -64(負 64)。現在 **加 1** 64 32 16 8 4 2 1
1 0 1 1 1 0 0
+ 1
1 0 1 1 1 0 1
如果我們執行一個快速的二進位制 -> 十進位制轉換,我們得到:-64 + 16 + 8 + 4 + 1 = -64 + 29 = **-35** |
要找出補碼數字的值,我們首先必須注意其符號位(最高有效位,最左邊的位),如果該位是 0,我們像往常一樣計算數字,如果該位是 1,則我們正在處理負數,需要找到它的值。
|
方法 1:將補碼轉換為十進位制 要找到負數的值,我們必須找到並保留最右邊的 1 及其右側的所有位,然後將左側的所有位翻轉。以下是一個示例 1111 1011 note the number is negative 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!)
|
|
方法 2:將補碼轉換為十進位制 要找到負數的值,我們必須取 MSB 並對其應用一個負值。然後我們可以將所有標題值加在一起 1111 1011 note the number is negative -128 64 32 16 8 4 2 1 1 1 1 1 1 0 1 1 -128 +64 +32 +16 +8 +2 +1 = -5 |
如何處理更復雜的例子?
|
方法 1:將補碼轉換為十進位制 1111 1100 note the number is negative 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!)
|
|
方法 2:將補碼轉換為十進位制 要找到負數的值,我們必須取 MSB 並對其應用一個負值。然後我們可以將所有標題值加在一起 1111 1100 note the number is negative -128 64 32 16 8 4 2 1 1 1 1 1 1 1 0 0 -128 +64 +32 +16 +8 +4 = -4 |
因此我們知道如何計算出給定負數的值。我們如何計算正數的負數版本?像這樣,就是這樣……
|
方法 1:將補碼轉換為二進位制 取正數的二進位制版本 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) |
|
方法 2:將補碼轉換為二進位制 取正數的二進位制版本 從 -128 開始,我們知道 MSB 值得 -128。我們需要從這個數字開始往回計算 -128 64 32 16 8 4 2 1 1 1 1 1 1 0 1 0 -128 +64 +32 +16 +8 +1 = -5 0000 0101 (5) 1111 1011 (−5) |
|
練習:補碼數字
0001 1011 答案 (正數)27 1111 1111 答案 (負數)0000 0001 = -1 0111 1101 答案 (正數)125 1001 1001 答案 (負數)0110 0111 = -103 1011 1000 答案 (負數)0100 1000 = -72 81(十六進位制) 答案 (每個 HEX 字元使用 4 位)1000 0001(負數)-> 0111 1111 = -127 A8(十六進位制) 答案 (每個 HEX 字元使用 4 位)1010 1000(負數)-> 0101 1000 = -88 將以下數字轉換為以二進位制表示的負數 0000 0001 答案 1111 1111 0110 0000 答案 1010 0000 0111 1111 答案 1000 0001 12(十進位制) 答案 0000 1100 = +12 -> 1111 0100 = -12 67(十進位制) 答案 0100 0011 = +67 -> 1011 1101 = -67 34 答案 0010 0010 = +34 -> 1101 1110 = -34 34(十六進位制) 答案 (每個 HEX 字元使用 4 位)0011 0100 = +52 -> 1100 1100 = -54 7E(十六進位制) 答案 (每個 HEX 字元使用 4 位)0111 1110 = +126 -> 1000 0010 = -126 |
如果 msb 用於提供負值,則最大可能值將受到限制。可能值的數目保持不變,這些數字的範圍將包括負值以及正值。
使用補碼錶示的 個二進位制位的範圍
| 規則 | ||
|
最小值 = 例如,對於 3 位: |
||
| 規則 | ||
|
最大值 = 例如,對於 3 位: |
||
|
示例:二進位制減法 在二進位制中,從一個數減去另一個數時,事情可能會變得非常混亂。 X (82 denary) 0101 0010 Y (78 denary) 0100 1110 − 從 X 中減去 Y 的一種更簡單的方法是將 Y 的負值加到 X 的值上。 X−Y = X+(−Y) 為此,我們首先需要找到 Y(十進位制 78)的負值。 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
|
|
練習:二進位制減法 找出以下二進位制和的答案,並展示你的計算過程。 0110 1100 (108) - 0000 0111 (7) 答案 將 0000 0111 轉換為負數 1111 1001 = -7 將這兩個數加在一起。 0110 1100 + 1111 1001 0110 0101 = 101 (¹)¹¹¹¹ the one carried over the bit 9 is ignored 0001 1111 (31) - 0001 0011 (19) 答案 將 0001 0011 轉換為負數 1110 1101 = -19 將這兩個數加在一起。 0001 1111 + 1110 1101 0000 1100 = 12 (¹)¹¹¹¹ ¹¹¹ the one carried over the bit 9 is ignored 0111 0111 (119) - 0101 1011 (91) 答案 將 0101 1011 轉換為負數 1010 0101 = -91 將這兩個數加在一起。 0111 0111 + 1010 0101 0001 1100 = 28 (¹)¹¹ ¹¹¹ the one carried over the bit 9 is ignored 23 (hex) - 1F (hex) 答案 將十六進位制值轉換為二進位制。 0010 0011 + 1110 0001 0000 0100 = 4 (¹)¹¹¹ ¹¹ the one carried over the bit 9 is ignored 0001 0010 (10) - 1110 0001 (-31) 答案 他們試圖欺騙你。負數減去負數是什麼? X - (-Y) = X + Y 0001 0010 (10) + 0001 1111 (31) 0011 0001 = 49 (¹) ¹¹ ¹¹ the one carried over the bit 9 is ignored |