轉(zhuǎn)自:
http://hi.baidu.com/cive/blog/item/f6899418726669b44aedbcc9.html------------------------------------------------------------------------------------------------------------------
數(shù)在計(jì)算機(jī)中是以二進(jìn)制形式表示的。
數(shù)分為有符號(hào)數(shù)和無符號(hào)數(shù)。
原碼、反碼、補(bǔ)碼都是有符號(hào)定點(diǎn)數(shù)的表示方法。
一個(gè)有符號(hào)定點(diǎn)數(shù)的最高位為符號(hào)位,0是正,1是副。
以下都以8位整數(shù)為例,
原碼就是這個(gè)數(shù)本身的二進(jìn)制形式。
例如
0000001 就是+1
1000001 就是-1
正數(shù)的反碼和補(bǔ)碼都是和原碼相同。
負(fù)數(shù)的反碼是將其原碼除符號(hào)位之外的各位求反
[-3]反=[10000011]反=11111100
負(fù)數(shù)的補(bǔ)碼是將其原碼除符號(hào)位之外的各位求反之后在末位再加1。
[-3]補(bǔ)=[10000011]補(bǔ)=11111101
一個(gè)數(shù)和它的補(bǔ)碼是可逆的。
為什么要設(shè)立補(bǔ)碼呢?
第一是為了能讓計(jì)算機(jī)執(zhí)行減法:
[a-b]補(bǔ)=a補(bǔ)+(-b)補(bǔ)
第二個(gè)原因是為了統(tǒng)一正0和負(fù)0
正零:00000000
負(fù)零:10000000
這兩個(gè)數(shù)其實(shí)都是0,但他們的原碼卻有不同的表示。
但是他們的補(bǔ)碼是一樣的,都是00000000
特別注意,如果+1之后有進(jìn)位的,要一直往前進(jìn)位,包括符號(hào)位!(這和反碼是不同的!)
[10000000]補(bǔ)
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符號(hào)位變成了0)
有人會(huì)問
10000000這個(gè)補(bǔ)碼表示的哪個(gè)數(shù)的補(bǔ)碼呢?
其實(shí)這是一個(gè)規(guī)定,這個(gè)數(shù)表示的是-128
所以n位補(bǔ)碼能表示的范圍是
-2^(n-1)到2^(n-1)-1
比n位原碼能表示的數(shù)多一個(gè)
又例:
1011
原碼:01011
反碼:01011 //正數(shù)時(shí),反碼=原碼
補(bǔ)碼:01011 //正數(shù)時(shí),補(bǔ)碼=原碼
-1011
原碼:11011
反碼:10100 //負(fù)數(shù)時(shí),反碼為原碼取反
補(bǔ)碼:10101 //負(fù)數(shù)時(shí),補(bǔ)碼為原碼取反+1
0.1101
原碼:0.1101
反碼:0.1101 //正數(shù)時(shí),反碼=原碼
補(bǔ)碼:0.1101 //正數(shù)時(shí),補(bǔ)碼=原碼
-0.1101
原碼:1.1101
反碼:1.0010 //負(fù)數(shù)時(shí),反碼為原碼取反
補(bǔ)碼:1.0011 //負(fù)數(shù)時(shí),補(bǔ)碼為原碼取反+1
總結(jié):
在計(jì)算機(jī)內(nèi),定點(diǎn)數(shù)有3種表示法:原碼、反碼和補(bǔ)碼
所謂原碼就是前面所介紹的二進(jìn)制定點(diǎn)表示法,即最高位為符號(hào)位,“0”表示正,“1”表示負(fù),其余位表示數(shù)值的大小。
反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。
補(bǔ)碼表示法規(guī)定:正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。
1、原碼、反碼和補(bǔ)碼的表示方法
(1) 原碼:在數(shù)值前直接加一符號(hào)位的表示法。
例如: 符號(hào)位 數(shù)值位
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
注意:a. 數(shù)0的原碼有兩種形式:
[+0]原=00000000B [-0]原=10000000B
b. 8位二進(jìn)制原碼的表示范圍:-127~+127
2)反碼:
正數(shù):正數(shù)的反碼與原碼相同。
負(fù)數(shù):負(fù)數(shù)的反碼,符號(hào)位為“1”,數(shù)值部分按位取反。
例如: 符號(hào)位 數(shù)值位
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
注意:a. 數(shù)0的反碼也有兩種形式,即
[+0]反=00000000B
[- 0]反=11111111B
b. 8位二進(jìn)制反碼的表示范圍:-127~+127
3)補(bǔ)碼的表示方法
1)模的概念:把一個(gè)計(jì)量單位稱之為模或模數(shù)。例如,時(shí)鐘是以12進(jìn)制進(jìn)行計(jì)數(shù)循環(huán)的,即以12為模。在時(shí)鐘上,時(shí)針加上(正撥)12的整數(shù)位或減去(反撥)12的整數(shù)位,時(shí)針的位置不變。14點(diǎn)鐘在舍去模12后,成為(下午)2點(diǎn)鐘(14=14-12=2)。從0點(diǎn)出發(fā)逆時(shí)針撥10格即減去10小時(shí),也可看成從0點(diǎn)出發(fā)順時(shí)針撥2格(加上2小時(shí)),即2點(diǎn)(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射為+2。由此可見,對(duì)于一個(gè)模數(shù)為12的循環(huán)系統(tǒng)來說,加2和減10的效果是一樣的;因此,在以12為模的系統(tǒng)中,凡是減10的運(yùn)算都可以用加2來代替,這就把減法問題轉(zhuǎn)化成加法問題了(注:計(jì)算機(jī)的硬件結(jié)構(gòu)中只有加法器,所以大部分的運(yùn)算都必須最終轉(zhuǎn)換為加法)。10和2對(duì)模12而言互為補(bǔ)數(shù)。
同理,計(jì)算機(jī)的運(yùn)算部件與寄存器都有一定字長(zhǎng)的限制(假設(shè)字長(zhǎng)為8),因此它的運(yùn)算也是一種模運(yùn)算。當(dāng)計(jì)數(shù)器計(jì)滿8位也就是256個(gè)數(shù)后會(huì)產(chǎn)生溢出,又從頭開始計(jì)數(shù)。產(chǎn)生溢出的量就是計(jì)數(shù)器的模,顯然,8位二進(jìn)制數(shù),它的模數(shù)為28=256。在計(jì)算中,兩個(gè)互補(bǔ)的數(shù)稱為“補(bǔ)碼”。
2)補(bǔ)碼的表示: 正數(shù):正數(shù)的補(bǔ)碼和原碼相同。
負(fù)數(shù):負(fù)數(shù)的補(bǔ)碼則是符號(hào)位為“1”,數(shù)值部分按位取反后再在末位(最低位)加1。也就是“反碼+1”。
例如: 符號(hào)位 數(shù)值位
[+7]補(bǔ)= 0 0000111 B
[-7]補(bǔ)= 1 1111001 B
補(bǔ)碼在微型機(jī)中是一種重要的編碼形式,請(qǐng)注意:
a.采用補(bǔ)碼后,可以方便地將減法運(yùn)算轉(zhuǎn)化成加法運(yùn)算,運(yùn)算過程得到簡(jiǎn)化。正數(shù)的補(bǔ)碼即是它所表示的數(shù)的真值,而負(fù)數(shù)的補(bǔ)碼的數(shù)值部份卻不是它所表示的數(shù)的真值。采用補(bǔ)碼進(jìn)行運(yùn)算,所得結(jié)果仍為補(bǔ)碼。
b.與原碼、反碼不同,數(shù)值0的補(bǔ)碼只有一個(gè),即 [0]補(bǔ)=00000000B。
c.若字長(zhǎng)為8位,則補(bǔ)碼所表示的范圍為-128~+127;進(jìn)行補(bǔ)碼運(yùn)算時(shí),應(yīng)注意所得結(jié)果不應(yīng)超過補(bǔ)碼所能表示數(shù)的范圍。