二补数 (2's complement)
二补数 (2's complement) :是一种用二进位表示有号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。
一个数字的二补数就是将该数字作位元反向运算(即一补数),再将结果加 1,即为该数字的二补数。
在二补数系统中,一个负数就是用其对应正数的二补数来表示。
优点:二补数系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。
只要一种加法电路就可以处理各种有号数加法,而且减法可以用一 个数加上另一个数的二补数来表示,因此只要有加法电路及二补数电路即可完成各种有号数加法及减法,在电路设计上相当方便。
特点:二补数系统的 0 只有一个表示方式,这点和一补数系统不同(在一补数系统中,0 有二种表示方式),因此在判断数字是否为 0 时,只较比对一个不同的条件即可。
具体算法:(转贴:原地址: http://entry.hit.edu.tw/~bd92046/new_page_1.htm)
二补数转换方法差异
方法1:
10進制轉2進制:
<1>直接將10進制轉為2進制,正負號省略。
<2>如果數目少於X bits,在左邊補0直到X bits。
<3>如果是正號,不需要其他動作。
如果是負號,使用1補數:將0變1,1變0;1補數加1,形成2補數。
例(1):將+6以16bit儲存,使用2補數。
+6 => 110 => 0000000000000110
例(2):將-125以16bit儲存,使用2補數。
-125 => 1111101 => 0000000001111101
=> 1111111110000010 => 1111111110000011
2進制轉10進制:
<1>如果最左邊的bit是0(正數)。
1-1…將數字由二進制轉為十進制。
1-2…在數字前加+號。
例:將0000000000000110轉為十進制(使用2補數)
0000000000000110 => 6 => +6
<2>如果最左邊的bit是1 (負數)。
2-1…2補數減1,變為1補數。
2-2…將所有的0變1;1變0。
2-3…將數字由2進制轉為10進制。
2-4…在數字前加-號。
例:將1111111110000100轉為十進制(使用2補數)
1111111110000011 => 1111111110000010
=> 0000000001111101 => 125 => -125
方法2:
10進制轉2進制:
<1>將數字改為2進制;正負號省略。
<2>如果數目少於X bits,在左邊補0直到X bits。
<3>如果是正號,不需要其他動作。
如果是負號,維持最右邊的0直到第一個1(包含)不變,其餘的皆變換。
(0變1,1變0)
例(1):將+6以16bit儲存,使用2補數
+6 => 110 => 0000000000000110
例(2):將-125以16bit儲存,使用2補數
-125 => 1111100 => 0000000001111100 => 1111111110000100
2進制轉10進制:
<1>如果最左邊的bit是0 (正數)。
1-1…將數字由2進制轉為10進制。
1-2…在數字前加+號。
例:將0000000000000110轉為10進制(使用2補數)
0000000000000110 => 6 => +6
<2>如果最左邊的bit是1 (負數)。
2-1…維持最右邊的bits不變直到第一個1(包含),其餘的皆變換。
(0變1,1變0)。
2-2…將數字由2進制轉為10進制。
2-3…在數字前加-號。
例1111111110000011轉為10進制(使用2補數)
1111111110000010 => 0000000001111101 => 125 => -125
二者之間的差異
10進制轉2進制:
方法1需要先轉換到1補數,再用1補數+1轉為2補數,使用上較為簡單,
但計算速度比較慢。
方法2就直接轉換成2補數,在使用上比較容易出錯,不過計算速度會比較快。
2進制轉10進制:
方法1須先使-1變為1補數,然後才能轉換成10進制,計算較為簡單,計算速度緩慢。
方法2可以直接轉換,比較容易出錯,但計算速度較快。