匯編語(yǔ)言--補(bǔ)碼
以8位的數(shù)據(jù)為例,對(duì)于無(wú)符號(hào)數(shù)來(lái)說(shuō)是從00000000b~11111111b到0~255一一對(duì)應(yīng)的。那么我們?nèi)绾螌?duì)有符號(hào)數(shù)進(jìn)行編碼嗎?即我們?nèi)绾斡?位數(shù)據(jù)表示有符號(hào)數(shù)呢?
既然表示的數(shù)有符號(hào),則必須要能夠區(qū)分正、負(fù)。
首先,我們可以考慮用8位數(shù)據(jù)的最高位來(lái)表示符號(hào),1表示負(fù),0表示正,而用其他位表示數(shù)值,如下:
00000000b |
0 |
00000001b |
1 |
00000010b |
2 |
01111111b |
127 |
10000000b |
??? |
10000001b |
-1 |
10000010b |
-2 |
11111111b |
-127 |
可見,用上面的表示方式,8位數(shù)據(jù)可以表示-127~127的254個(gè)有符號(hào)數(shù)。從這里我們看出一些問題(注意問號(hào)處),8位數(shù)據(jù)可以表示255種不同的信息,也就是說(shuō)應(yīng)該可以表示255個(gè)有符號(hào)數(shù),可用上面的方法,只能表示254個(gè)有符號(hào)數(shù)。注意,用上面的方法,00000000b和10000000b都表示0,一個(gè)是0,一個(gè)是-0,當(dāng)然不可能有-0。可以看出,這種表示有符號(hào)數(shù)的方法是有問題的,它并不能正確地表示有符號(hào)數(shù)。
我們?cè)倏紤]用反碼來(lái)表示,這種思想是,我們先確定用00000000b~01111111b表示0~127,然后再用它們按位取反后的數(shù)據(jù)表示負(fù)數(shù)。如下:
00000000b |
0 |
|
11111111b |
??? |
00000001b |
1 |
|
11111110b |
-1 |
00000010b |
2 |
|
11111101b |
-2 |
01111111b |
127 |
|
10000000b |
-127 |
可以看出,用反碼表示有符號(hào)數(shù)存在同樣的問題,0出現(xiàn)重碼(注意問號(hào)處)。
為了解決這種問題,采用一種稱為補(bǔ)碼的編碼方法。這種思想是:先確定用00000000b~01111111b表示0~127,然后再用它們按位取反加1后的數(shù)據(jù)表示負(fù)數(shù)。如下:
00000000b |
0 |
|
11111111b + 1 =00000000b |
0 |
00000001b |
1 |
|
11111110b + 1 =11111111b |
-1 |
00000010b |
2 |
|
11111101b + 1 =11111110b |
-2 |
01111111b |
127 |
|
10000000b + 1 =10000001b |
-127 |
觀察上面的數(shù)據(jù),我們可以發(fā)現(xiàn),補(bǔ)碼方案中:
1)最高位為1,表示負(fù)數(shù);
2)正數(shù)的補(bǔ)碼取反加1后,為其對(duì)應(yīng)的負(fù)數(shù)的補(bǔ)碼:負(fù)數(shù)的補(bǔ)碼取反加1后,為其絕對(duì)值,比如:
1的補(bǔ)碼為:00000001b,取反加1后為:11111111b,表示-1;
-1的補(bǔ)碼為:11111111b,取反加1后為:00000001,其絕對(duì)值為1。
我們從一個(gè)負(fù)數(shù)的補(bǔ)碼不太容易看出它所表示的數(shù)據(jù),比如:11010101b表示的數(shù)據(jù)是多少?
但是我們利用補(bǔ)碼的特性,將11010101b取反加1后為:00101011b,可以知11010101b表示的負(fù)數(shù)的絕對(duì)值為:2BH,則11010101b表示的負(fù)數(shù)為-2BH。
那么-20的補(bǔ)碼是多少呢?
用補(bǔ)碼的特性,-20的絕對(duì)值是20,00010100b,將其取反加1后為:11101100b。可知-20H的補(bǔ)碼為:1101100b。
那么10000000b表示多少呢?
10000000b取反加1后為:10000000b,其大小為128,所以10000000b表示-128。
8位補(bǔ)碼所表示的數(shù)的范圍:-128~127。
補(bǔ)碼為有符號(hào)數(shù)的運(yùn)算提供了方便,運(yùn)算后的結(jié)果依舊滿足補(bǔ)碼規(guī)則。
比如:
|
計(jì)算 |
補(bǔ)碼表示 |
|
10 |
00001010b |
|
+(-20) |
11101100b |
結(jié)果 |
-10 |
11110110b |
|
計(jì)算 |
補(bǔ)碼表示 |
|
10 |
00001010b |
|
+(-128) |
10000000b |
結(jié)果 |
-118 |
10001010b |
posted on 2010-08-05 09:52 luqingfei 閱讀(2380) 評(píng)論(0) 編輯 收藏 引用 所屬分類: 匯編語(yǔ)言基礎(chǔ)學(xué)習(xí)