我們都知道遗淳,在計(jì)算機(jī)的內(nèi)部变泄,所有的數(shù)據(jù)都是以二進(jìn)制的形式存儲的令哟,為了區(qū)分正數(shù)和負(fù)數(shù),在最高位拿出來當(dāng)作符號位妨蛹,0表示正數(shù)屏富,1表示負(fù)數(shù)。而且蛙卤,負(fù)數(shù)的存儲役听,除了最高位的符號位,其他位使用的是補(bǔ)碼的形式存儲的表窘。
計(jì)算一個數(shù)值的二進(jìn)制補(bǔ)碼典予,以下3個步驟:
- 求這個值的絕對值的二進(jìn)制原碼
- 原碼取反,得到反碼
- 反碼加1乐严,即是補(bǔ)碼
例如瘤袖,要求-18的二進(jìn)制碼,首先求18的二進(jìn)制碼:
0000 0000 0000 0000 0000 0000 0001 0010
求其反碼:
1111 1111 1111 1111 1111 1111 1110 1101
最后反碼加1
1111 1111 1111 1111 1111 1111 1110 1110
這樣就求得了-18的二進(jìn)制表示昂验。
問題來了捂敌,為什么要采用補(bǔ)碼的形式來表示負(fù)數(shù)呢?
答案是既琴,為了方便計(jì)算占婉。
為何這么說呢?下面咱們一步一步的來看這個問題甫恩。
為了簡化這個問題逆济,我們使用8位二進(jìn)制表示整數(shù)。實(shí)際計(jì)算機(jī)使用32位表示。
那么奖慌,正整數(shù) 1 的二進(jìn)制表示就是:
0000 0001
我們說過了抛虫,最高位為符號位,那么 -1 的二進(jìn)制應(yīng)該為如下形式:
1xxx xxxx
對吧简僧,最高位為1建椰,表示負(fù)數(shù)。
如果除了符號位之外岛马,其他位我們使用原碼表示的話棉姐,-1 的二進(jìn)制是不是應(yīng)該如下:
1000 0001
那么,我們來計(jì)算一下 -1 + 1 的值:
1000 0001
0000 0001
---------
1000 0010
換算成整數(shù)是多少啦逆,-2伞矩。這和正常的邏輯,-1+1=0相差甚遠(yuǎn)蹦浦。為什么,除了符號位撞蜂,正常位使用的是原碼盲镶,那么-1和1是相同的,都是1溉贿,相加的結(jié)果是2,再加上符號位宇色,-2.
從這里我們可以看出颁湖,除了符號位宣蠕,負(fù)數(shù)的其他位斷然不能使用原碼表示。否則會出現(xiàn)計(jì)算邏輯錯誤甥捺。
開篇我們說過了抢蚀,負(fù)數(shù)采用補(bǔ)碼的形式镰禾,那么,補(bǔ)碼這個定義怎么來的吴侦,為什么這么計(jì)算呢屋休?
我們慢慢來看。
-1 + 1 = 0
這個不必多說對吧备韧,0的二進(jìn)制是什么劫樟?
0000 0000
那么,-1 + 1 = 0
二進(jìn)制是不是應(yīng)該如下面的方式進(jìn)行表示:
1xxx xxxx
0000 0001
---------
0000 0000
可能有人會問了毅哗,怎么可能,不管-1的二進(jìn)制中x是多少尿瞭,符號位 1 + 0 = 1
啊翅睛,算出來的永遠(yuǎn)是個負(fù)數(shù)吧椤捕发??扎酷?
是啊,但是如果發(fā)生進(jìn)位了呢谁榜?我們采用8位表示一個整數(shù)凡纳,如果發(fā)生進(jìn)位了,產(chǎn)生了9位荐糜,發(fā)生了溢出:
1 0000 0000
由于發(fā)生了溢出,最高位的1被舍棄暴氏,取低8位,是多少页畦,0 啊研儒,對不對。
那-1的二進(jìn)制碼是多少才能使計(jì)算發(fā)生進(jìn)位端朵,算一下啦,-1的二進(jìn)制應(yīng)該是:
1111 1111 //-1
0000 0001 //1
----------
10000 0000 //發(fā)生進(jìn)位舍败,最高位1被舍棄,最后結(jié)果為0
好了邻薯,到這里我們知道了,-1的二進(jìn)制表示為1111 1111
厕诡,那有什么規(guī)律嗎,到底怎么算才能得到這個二進(jìn)制表示壹罚,我們不能每次求一個負(fù)數(shù)的二進(jìn)制的時候都用發(fā)生進(jìn)位的二進(jìn)制去減正數(shù)的二進(jìn)制來獲取笆傩摺猖凛?
是的绪穆,我們來找一下規(guī)律看看。
試想一下菠红,什么時候會發(fā)生進(jìn)位,發(fā)生溢出呢途乃?
所有的位都變成了1, 再加1就進(jìn)位發(fā)生溢出了呀扔傅。我們再來看一下上面的計(jì)算烫饼,
1111 1111 //-1
0000 0001 //1
----------
10000 0000 //發(fā)生進(jìn)位,最高位1被舍棄杠纵,最后結(jié)果為0
那么,對于一個二進(jìn)制而言铝量,怎么才能得到全部的位都是1呢银亲?
反碼啊,不管你二進(jìn)制的位是0還是1务蝠,加上他的反碼后得到的就是全部的位都是1,好了,再加1践瓷,就得到了0.
我們就把反碼加1的這個值作為負(fù)數(shù)的二進(jìn)制表示亡蓉。我們把這種形式叫做補(bǔ)碼,也就是上面我們從書里看到的寸宵,補(bǔ)碼的計(jì)算,其反碼加1.
采用補(bǔ)碼巫员,正負(fù)相加為0的計(jì)算能夠表示清楚了甲棍,那么其他呢計(jì)算對不對呢,比如 -5 + 3感猛,-4 + (-2)等的形式呢?
先來看看 -5 + 3
-5的二進(jìn)制: 1111 1011
3的二進(jìn)制: 0000 0011
---------
1111 1110
哪個數(shù)的二進(jìn)制是1111 1110
呢颈走,首先看符號位是1咱士,說明是一個負(fù)數(shù),我們按照負(fù)數(shù)二進(jìn)制補(bǔ)碼的計(jì)算方式序厉,逆運(yùn)算回去
1111 1110
- 1 //減1
---------
1111 1101 //得到反碼
0000 0010 //取反
因此,得到的數(shù)是 0000 0010
道盏,這個數(shù)的值是2.由于符號位為1文捶,因此這里是-2.即-5+3=-2
如果都是負(fù)數(shù)呢,-4 + (-2)
-4的二進(jìn)制:1111 1100
-2的二進(jìn)制:1111 1110
-----------
11111 1010
這里超出8位粹排,發(fā)生溢出,最高位舍棄院促,最終結(jié)果 1111 1010
符號位1,表示負(fù)數(shù)常拓。逆運(yùn)算回去:
1111 1010
1 //減1
1111 1001
0000 0110 //取反
獲得的值為 2^1 + 2^2 = 6
由于符號位為1表示負(fù)數(shù),最終結(jié)果是 -6
由此看來茎辐,負(fù)數(shù)采用補(bǔ)碼的形式掂恕,是為了方便計(jì)算機(jī)內(nèi)的運(yùn)算“猛觯總的下來,也明白了補(bǔ)碼是怎么來的速警,怎么運(yùn)算的鸯两。