機(jī)器數(shù)
一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制表示形式,叫做這個(gè)數(shù)的機(jī)器數(shù)择膝,機(jī)器數(shù)是帶符號(hào)的誓琼,在計(jì)算機(jī)中用一個(gè)數(shù)的最高位存放符號(hào),正數(shù)為0肴捉,負(fù)數(shù)為1腹侣。
比如,十進(jìn)制中的+3齿穗,假設(shè)計(jì)算機(jī)字長為8位傲隶,轉(zhuǎn)換成二進(jìn)制就是0000 0011。
如果是-3窃页,就是1000 0011.那么跺株,這里0000 0011和1000 0011就是機(jī)器數(shù)。
真值
因?yàn)榈谝晃粸榉?hào)位脖卖,所以機(jī)器數(shù)的形式值就不等于真正的數(shù)值乒省,例如上面的有符號(hào)數(shù)1000 0011,其最高位1代表負(fù)畦木,其真正數(shù)值是-3,而不是形式值131(1000 0011轉(zhuǎn)換成10進(jìn)制等于131)袖扛,所以為了區(qū)別起見,將帶符號(hào)的機(jī)器數(shù)對(duì)應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值十籍。
例如:0000 0001的真值=+000 0001=+1,
1000 0001的真值=-000 0001=-1
原碼:
原碼就是符號(hào)位加上真值的絕對(duì)值蛆封,即用第一位表示符號(hào),其余位表示值勾栗,
比如如果是8位二進(jìn)制惨篱,[+1]原=0000 0001.[-1]原=1000 0001.因?yàn)榈谝晃皇欠?hào)位,所以8位二進(jìn)制的取值范圍就是:[1111 1111,0111 1111]即[-127,127]围俘,原碼是人腦最容易理解和計(jì)算的表示方式妒蛇。
反碼:
反碼的表示方法是:正數(shù)的反碼是其本身,負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上楷拳,符號(hào)位不變绣夺,其余各個(gè)位取反,
[+1]=[0000 0001]原= [0000 0001]反欢揖,
[-1]=[1000 0001]原=[1111 1110]反陶耍。
可見如果一個(gè)反碼表示的是負(fù)數(shù),人腦無法直觀的看出來它的數(shù)值她混,通常要將其轉(zhuǎn)換成原碼再計(jì)算烈钞。
補(bǔ)碼:
補(bǔ)碼的表示方法是:正整數(shù)的二進(jìn)制補(bǔ)碼與其二進(jìn)制原碼相同泊碑,負(fù)整數(shù)的二進(jìn)制補(bǔ)碼,先求與該負(fù)數(shù)相對(duì)應(yīng)的正整數(shù)的二進(jìn)制代碼毯欣,然后所有位取反加1馒过,不夠位數(shù)時(shí)左邊補(bǔ)1,
例如酗钞,[+1]=[0000 0001]原=[0000 0001]反=[0000 0001]補(bǔ)腹忽,
[-1]=[1000 0001]原=[1111 1110]反=[1111 1111]補(bǔ),
對(duì)于負(fù)數(shù)砚作,補(bǔ)碼表示方式也是人腦無法直觀看出其數(shù)值的窘奏,通常也需要轉(zhuǎn)換成原碼再計(jì)算其數(shù)值。
為什么要使用原碼反碼補(bǔ)碼葫录,
現(xiàn)在我們知道了計(jì)算機(jī)可以用原碼 反碼 補(bǔ)碼這三種編碼方式表示一個(gè)數(shù)着裹,對(duì)于正數(shù)因?yàn)槿N編碼方式都相同,沒有什么好解釋的米同,但是對(duì)于負(fù)數(shù)骇扇,負(fù)數(shù)的原碼反碼補(bǔ)碼是完全不同的,既然原碼才是被人腦直接識(shí)別并用于計(jì)算方式面粮,那么為什么還要用反碼和補(bǔ)碼呢匠题,首先,因?yàn)槿四X可以知道原碼的第一位是符號(hào)位但金,在計(jì)算的時(shí)候韭山,我們會(huì)根據(jù)符號(hào)位,選擇對(duì)真值區(qū)域的加減冷溃,但是對(duì)于計(jì)算機(jī)钱磅,加減乘除已經(jīng)是最基礎(chǔ)的運(yùn)算,要設(shè)計(jì)的盡量簡單似枕,計(jì)算機(jī)辨別符號(hào)位顯然會(huì)讓計(jì)算機(jī)的基礎(chǔ)電路設(shè)計(jì)變得十分復(fù)雜盖淡,于是人們想出了將符號(hào)位也參與運(yùn)算的方法。
我們知道凿歼,根據(jù)運(yùn)算法則減去一個(gè)正數(shù)等于加上一個(gè)負(fù)數(shù)褪迟,即:1-1=1+(-1)=0;所以機(jī)器可以只有加法而沒有減法答憔,這樣計(jì)算機(jī)運(yùn)算的設(shè)計(jì)就更簡單了味赃,那么如果用原碼計(jì)算,1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[1000 0010]原=-2.如果用原碼計(jì)算虐拓,讓符號(hào)位也參與運(yùn)算心俗,顯然對(duì)于減法來說,結(jié)果是不正確的,這也就是為什么計(jì)算機(jī)內(nèi)部不用原碼表示一個(gè)數(shù)城榛。
為了解決原碼做減法的問題出現(xiàn)了反碼揪利,如果用反碼計(jì)算減法,1-1=1+(-1)= [0000 0001]原+ [1000 0001]原=[0000 0001]反+[1111 1110反]=[1111 1111]反=[1000 0000]原=-0狠持,發(fā)現(xiàn)用反碼計(jì)算減法疟位,結(jié)果的真值部分是正確的,而唯一的問題其實(shí)出現(xiàn)在0這個(gè)特殊的數(shù)值上喘垂,雖然人們理解上+0和-0是一樣的甜刻,但是0帶符號(hào)是沒有任何意義的,而且會(huì)有[0000 0000]原和[1000 0000]原兩個(gè)編碼表示0王污。
于是補(bǔ)碼的出現(xiàn)罢吃,解決了0的符號(hào)以及兩個(gè)編碼的問題:1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]補(bǔ)+[1111 1111]補(bǔ)=[0000 0000]補(bǔ)=[0000 0000]原楚午,這樣0用[0000 0000]表示昭齐,而以前出現(xiàn)的問題-0則不存在了,而且可以用[1000 0000]表示-128矾柜;(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補(bǔ) + [1000 0001]補(bǔ) = [1000 0000]補(bǔ)阱驾。-1-127的結(jié)果應(yīng)該是-128, 在用補(bǔ)碼運(yùn)算的結(jié)果中, [1000 0000]補(bǔ) 就是-128。 但是注意因?yàn)閷?shí)際上是使用以前的-0的補(bǔ)碼來表示-128, 所以-128并沒有原碼和反碼表示.(對(duì)-128的補(bǔ)碼表示[1000 0000]補(bǔ)算出來的原碼是[0000 0000]原, 這是不正確的)怪蔑。使用補(bǔ)碼, 不僅僅修復(fù)了0的符號(hào)以及存在兩個(gè)編碼的問題, 而且還能夠多表示一個(gè)最低數(shù). 這就是為什么8位二進(jìn)制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補(bǔ)碼表示的范圍為[-128, 127].因?yàn)闄C(jī)器使用補(bǔ)碼, 所以對(duì)于編程中常用到的32位int類型, 可以表示范圍是: [-231, 231-1] 因?yàn)榈谝晃槐硎镜氖欠?hào)位.而使用補(bǔ)碼表示時(shí)又可以多保存一個(gè)最小值里覆。