二补数 (2's complement)

系统 1789 0

二补数 (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可以直接轉換,比較容易出錯,但計算速度較快。

二补数 (2's complement)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论