二補(bǔ)數(shù) (2's complement) :是一種用二進(jìn)位表示有號(hào)數(shù)的方法,也是一種將數(shù)字的正負(fù)號(hào)變號(hào)的方式,常在計(jì)算機(jī)科學(xué)中使用。
一個(gè)數(shù)字的二補(bǔ)數(shù)就是將該數(shù)字作位元反向運(yùn)算(即一補(bǔ)數(shù)),再將結(jié)果加 1,即為該數(shù)字的二補(bǔ)數(shù)。
在二補(bǔ)數(shù)系統(tǒng)中,一個(gè)負(fù)數(shù)就是用其對(duì)應(yīng)正數(shù)的二補(bǔ)數(shù)來表示。
優(yōu)點(diǎn):二補(bǔ)數(shù)系統(tǒng)的最大優(yōu)點(diǎn)是可以在加法或減法處理中,不需因?yàn)閿?shù)字的正負(fù)而使用不同的計(jì)算方式。
????????? 只要一種加法電路就可以處理各種有號(hào)數(shù)加法,而且減法可以用一 個(gè)數(shù)加上另一個(gè)數(shù)的二補(bǔ)數(shù)來表示,因此只要有加法電路及二補(bǔ)數(shù)電路即可完成各種有號(hào)數(shù)加法及減法,在電路設(shè)計(jì)上相當(dāng)方便。
特點(diǎn):二補(bǔ)數(shù)系統(tǒng)的 0 只有一個(gè)表示方式,這點(diǎn)和一補(bǔ)數(shù)系統(tǒng)不同(在一補(bǔ)數(shù)系統(tǒng)中,0 有二種表示方式),因此在判斷數(shù)字是否為 0 時(shí),只較比對(duì)一個(gè)不同的條件即可。
具體算法:(轉(zhuǎn)貼:原地址: http://entry.hit.edu.tw/~bd92046/new_page_1.htm )
二補(bǔ)數(shù)轉(zhuǎn)換方法差異
方法1:
10進(jìn)制轉(zhuǎn)2進(jìn)制:
<1>直接將10進(jìn)制轉(zhuǎn)為2進(jìn)制,正負(fù)號(hào)省略。
<2>如果數(shù)目少於X bits,在左邊補(bǔ)0直到X bits。
<3>如果是正號(hào),不需要其他動(dòng)作。
?? 如果是負(fù)號(hào),使用1補(bǔ)數(shù):將0變1,1變0;1補(bǔ)數(shù)加1,形成2補(bǔ)數(shù)。
例(1):將+6以16bit儲(chǔ)存,使用2補(bǔ)數(shù)。
????????? +6 => 110 => 0000000000000110
例(2):將-125以16bit儲(chǔ)存,使用2補(bǔ)數(shù)。
????????? -125 => 1111101 => 0000000001111101
?????????????? => 1111111110000010 => 1111111110000011
2進(jìn)制轉(zhuǎn)10進(jìn)制:
<1>如果最左邊的bit是0(正數(shù))。
??? 1-1…將數(shù)字由二進(jìn)制轉(zhuǎn)為十進(jìn)制。
??? 1-2…在數(shù)字前加+號(hào)。
例:將0000000000000110轉(zhuǎn)為十進(jìn)制(使用2補(bǔ)數(shù))
?????? 0000000000000110 => 6 => +6
<2>如果最左邊的bit是1 (負(fù)數(shù))。
?? 2-1…2補(bǔ)數(shù)減1,變?yōu)?補(bǔ)數(shù)。
?? 2-2…將所有的0變1;1變0。
?? 2-3…將數(shù)字由2進(jìn)制轉(zhuǎn)為10進(jìn)制。
?? 2-4…在數(shù)字前加-號(hào)。
例:將1111111110000100轉(zhuǎn)為十進(jìn)制(使用2補(bǔ)數(shù))
?????? 1111111110000011 => 1111111110000010
??????????????????????? => 0000000001111101 => 125 => -125
方法2:
10進(jìn)制轉(zhuǎn)2進(jìn)制:
<1>將數(shù)字改為2進(jìn)制;正負(fù)號(hào)省略。
<2>如果數(shù)目少於X bits,在左邊補(bǔ)0直到X bits。
<3>如果是正號(hào),不需要其他動(dòng)作。
?? 如果是負(fù)號(hào),維持最右邊的0直到第一個(gè)1(包含)不變,其餘的皆變換。
?? (0變1,1變0)
例(1):將+6以16bit儲(chǔ)存,使用2補(bǔ)數(shù)
???????? +6 => 110 => 0000000000000110
例(2):將-125以16bit儲(chǔ)存,使用2補(bǔ)數(shù)
???????? -125 => 1111100 => 0000000001111100 => 1111111110000100
2進(jìn)制轉(zhuǎn)10進(jìn)制:
<1>如果最左邊的bit是0 (正數(shù))。
1-1…將數(shù)字由2進(jìn)制轉(zhuǎn)為10進(jìn)制。
1-2…在數(shù)字前加+號(hào)。
例:將0000000000000110轉(zhuǎn)為10進(jìn)制(使用2補(bǔ)數(shù))
?????? 0000000000000110 => 6 => +6
<2>如果最左邊的bit是1 (負(fù)數(shù))。
2-1…維持最右邊的bits不變直到第一個(gè)1(包含),其餘的皆變換。
??? (0變1,1變0)。
2-2…將數(shù)字由2進(jìn)制轉(zhuǎn)為10進(jìn)制。
2-3…在數(shù)字前加-號(hào)。
例1111111110000011轉(zhuǎn)為10進(jìn)制(使用2補(bǔ)數(shù))
?? 1111111110000010 => 0000000001111101 => 125 => -125
二者之間的差異
10進(jìn)制轉(zhuǎn)2進(jìn)制:
方法1需要先轉(zhuǎn)換到1補(bǔ)數(shù),再用1補(bǔ)數(shù)+1轉(zhuǎn)為2補(bǔ)數(shù),使用上較為簡(jiǎn)單,
??????? 但計(jì)算速度比較慢。
方法2就直接轉(zhuǎn)換成2補(bǔ)數(shù),在使用上比較容易出錯(cuò),不過計(jì)算速度會(huì)比較快。
2進(jìn)制轉(zhuǎn)10進(jìn)制:
方法1須先使-1變?yōu)?補(bǔ)數(shù),然後才能轉(zhuǎn)換成10進(jìn)制,計(jì)算較為簡(jiǎn)單,計(jì)算速度緩慢。
方法2可以直接轉(zhuǎn)換,比較容易出錯(cuò),但計(jì)算速度較快。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
