小古銀的官方網(wǎng)站(完整教程):http://www.xiaoguyin.com/
C++入門(mén)教程視頻:https://www.bilibili.com/video/av20868986/
前面已經(jīng)講過(guò)二進(jìn)制和整數(shù)的關(guān)系,現(xiàn)在再補(bǔ)充一下。我們知道數(shù)據(jù)都是使用二進(jìn)制保存和處理的,而二進(jìn)制沒(méi)有正負(fù)的概念,那么二進(jìn)制是怎么表示負(fù)數(shù)呢?現(xiàn)在就來(lái)講解這個(gè)問(wèn)題。
結(jié)論
結(jié)論放在前面:計(jì)算機(jī)中所有的數(shù)值都是用補(bǔ)碼表示的。
原碼
固定好二進(jìn)制的位數(shù)之后,用最高位來(lái)表示數(shù)值的正負(fù),最高位用0來(lái)表示正數(shù),最高位用1來(lái)表示負(fù)數(shù)。例如固定二進(jìn)制8位,十進(jìn)制10的原碼是00001010,而十進(jìn)制-10的原碼是10001010。
反碼
固定好二進(jìn)制的位數(shù)之后,正數(shù)的反碼和原碼相同,負(fù)數(shù)的反碼就是除了符號(hào)位外的所有位上,1變0,0變1。例如例如固定二進(jìn)制8位,十進(jìn)制10的反碼是00001010,而十進(jìn)制-10的反碼是11110101。
補(bǔ)碼
固定好二進(jìn)制的位數(shù)之后,正數(shù)的補(bǔ)碼和原碼相同,負(fù)數(shù)的補(bǔ)碼就是它的反碼+1。例如例如固定二進(jìn)制8位,十進(jìn)制10的補(bǔ)碼是00001010,而十進(jìn)制-10的補(bǔ)碼是11110110。
使用補(bǔ)碼的原因
以十進(jìn)制的10和-6并且固定二進(jìn)制位為8位作為例子:
上面兩個(gè)數(shù)值的原碼分別是00001010和10000110,如果這兩個(gè)二進(jìn)制相加,按照加法運(yùn)算的結(jié)果是10010000,轉(zhuǎn)換為十進(jìn)制就是-16,答案不正確。
上面兩個(gè)數(shù)值的補(bǔ)碼分別是00001010和11111010,如果這兩個(gè)二進(jìn)制相加,按照加法運(yùn)算的結(jié)果是00000100,轉(zhuǎn)換為十進(jìn)制就是4,答案正確。
如果用原碼來(lái)表示數(shù)值,那么在運(yùn)算過(guò)程中需要做一些處理才能計(jì)算出正確結(jié)果,如果用補(bǔ)碼表示數(shù)據(jù)就不需要再處理,可以直接運(yùn)算。因此為了使運(yùn)算更加方便,計(jì)算機(jī)保存和處理數(shù)值都用補(bǔ)碼。
補(bǔ)碼轉(zhuǎn)原碼
只需要對(duì)補(bǔ)碼再進(jìn)行補(bǔ)碼操作即可。例如例如固定二進(jìn)制8位,十進(jìn)制10的補(bǔ)碼是00001010,補(bǔ)碼再補(bǔ)碼是00001010;而十進(jìn)制-10的補(bǔ)碼是11110110,補(bǔ)碼再補(bǔ)碼是10001010,也就是-10的原碼。
正負(fù)數(shù)轉(zhuǎn)換
對(duì)于unsigned int和int,它們都是用二進(jìn)制32位空間來(lái)保存數(shù)據(jù)的,一個(gè)表示的是無(wú)符號(hào)的數(shù)值,另一個(gè)表示的是有符號(hào)的數(shù)值。假如有一個(gè)二進(jìn)制數(shù)據(jù)0b1111'1111'1111'1111'1111'1111'1111'1111,如果這個(gè)數(shù)值用unsigned int表示就是unsigned int的最大值;而如果這個(gè)數(shù)值用int表示就是-1。所以就有一個(gè)很神奇的現(xiàn)象就是unsigned int value = -1;,當(dāng)輸出變量value的時(shí)候,顯示的就是unsigned int的最大值。
鞏固練習(xí)
- 求
+9的補(bǔ)碼。 - 求
-5的補(bǔ)碼。 - 求
+0和-0的補(bǔ)碼。 - 已知一個(gè)補(bǔ)碼為
11111001,求原碼。