跳轉到內容

資料表示基礎:補碼

來自華夏公益教科書,開放書籍,開放世界

PAPER 2 - ⇑ 資料表示基礎 ⇑

← 無符號二進位制算術 補碼 二進位制分數 →



幾乎所有計算機都完全使用二進位制。這意味著它們只使用 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 用於提供負值,則最大可能值將受到限制。可能值的數目保持不變,這些數字的範圍將包括負值以及正值。

使用補碼錶示的 個二進位制位的範圍

二進位制減法

[編輯 | 編輯原始碼]
示例:二進位制減法

在二進位制中,從一個數減去另一個數時,事情可能會變得非常混亂。

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 = 23 十六進位制或 35 十進位制。
0001 1111 = 1F 十六進位制或 31 十進位制。
現在讓我們找到 1F 的負值。
1110 0001 = -31
將這兩個數加在一起。

   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
讓我們首先找到底部數字的值:1110 0001 -> 0001 1111 = 31
透過計算得出,我們得到了正值 (0001 1111) 將這兩個數加在一起。

   0001 0010 (10)
 + 0001 1111 (31)
   0011 0001 = 49
(¹)  ¹¹ ¹¹     the one carried over the bit 9 is ignored
華夏公益教科書