在高中之前,數(shù)學(xué)是這樣的,1+1=2 .這些都是死的。
上了大學(xué)之后,這個(gè)世界是這樣的……
機(jī)器語言最低級(jí)的語言,只有兩個(gè)標(biāo)志 0和1.通過這兩個(gè)標(biāo)志來實(shí)現(xiàn)計(jì)算。
以前我們所做的數(shù)學(xué)運(yùn)算都是在10進(jìn)制上面進(jìn)行的。而計(jì)算機(jī)只能用二進(jìn)制的數(shù)來進(jìn)行運(yùn)算。
大家都知道9用機(jī)器語言為 1001(進(jìn)制的轉(zhuǎn)換不做詳細(xì)介紹)
再轉(zhuǎn)換之前,這個(gè)數(shù)可是有要求的,這個(gè)數(shù)必須是正整數(shù),才可以進(jìn)行轉(zhuǎn)換。如果這個(gè)數(shù)為 -9,那么這個(gè)數(shù)如何用機(jī)器語言來表示呢。如果是小數(shù),又是如何表示的。
+9和-9,不就是相差一個(gè)符號(hào)么,多給一個(gè)位,進(jìn)行標(biāo)志不就可以了嘛。
+9表示為 0000 1001
-9表示為 0001 1001
利用二進(jìn)制的數(shù)來處理 我們已知的問題,無非就是編碼,制定規(guī)則而已。
然后,人們就把這種加上符號(hào)位的表示方法 稱為 原碼。
計(jì)算機(jī)中,可以直接計(jì)算的運(yùn)算,只有一個(gè)加法。
比如:9+11=20
1001+1011=1 0100
如果,在進(jìn)行運(yùn)算的時(shí)候使用原碼進(jìn)行運(yùn)算
即:0000 1001+0000 1011=01 0100
這個(gè)運(yùn)算是正整數(shù)之間的加法,如果在進(jìn)行運(yùn)算的數(shù)之間,有小數(shù),或者 負(fù)數(shù)。那應(yīng)該如何處理呢?
注:下面中的碼,帶下劃線的為符號(hào)位。
人們都知道,包含負(fù)數(shù)的加法,實(shí)際上就是所謂的減法。所以要處理的就是,如何把負(fù)數(shù)加入到剛才的加法運(yùn)算中。
9-3=6 改寫成9+(-3)=6
使用原碼表示進(jìn)行運(yùn)算:0000 1001 +0001 0011=11100=-12
這個(gè)結(jié)果,顯然就不正確了吧。
那這個(gè)問題又是如何產(chǎn)生的?這個(gè)問題,是由于把原碼中的符號(hào)位進(jìn)行了計(jì)算,導(dǎo)致結(jié)果不正確的。
既然結(jié)果不正確,那么就編唄。反正找到一個(gè)能計(jì)算正確的規(guī)則。起個(gè)名字不就得了。
首先,要想正確,需要把符號(hào)位 也可以進(jìn)行計(jì)算。
首先,兩個(gè)數(shù)進(jìn)行運(yùn)算的時(shí)候.符號(hào)位后面的字符串,代表的才是真實(shí)數(shù)值的絕對(duì)值。
在說補(bǔ)碼之前,先舉一個(gè)例子。
在現(xiàn)實(shí)生活中,某一個(gè)時(shí)刻,你看鐘表的時(shí)候是9點(diǎn)。之后,你活動(dòng)了9個(gè)小時(shí)。現(xiàn)在是幾點(diǎn)?
先說正常人是怎么算的,正常人肯定是:9+9-12=6 嗯,現(xiàn)在6點(diǎn)了。
還有一種算法,就是。你知道12個(gè)小時(shí)是一圈。那么過去了9個(gè)小時(shí),則可以這么算:9-(12-9)=6 也是6點(diǎn)。
在來看一個(gè)上面這個(gè)例子:
+9 + (-3)
0000 1001 + 0001 0011
如果利用原碼進(jìn)行計(jì)算,肯定結(jié)果不正確了。符號(hào)位之前的暫時(shí)不考慮
我把負(fù)數(shù)的原碼 進(jìn)行一下轉(zhuǎn)換,轉(zhuǎn)換成 1100
之后在進(jìn)行計(jì)算: 0000 1001 + 0001 1100 = 0010 0101 符號(hào)位發(fā)生了變化。 數(shù)值應(yīng)該為21.但是21>15=2^4-1 所以 影響了符號(hào)位。 在自己算一下 -3 到 12的改變量。 所以結(jié)果為 21-15=+6
在此之前,沒有考慮符號(hào)位。不考慮符號(hào)位,將符號(hào)位之后的符號(hào),都按位取反。0改成1,1改成0.
這個(gè)形式的編碼稱為 反碼。
這樣計(jì)算機(jī)就可以計(jì)算 二進(jìn)制的減法了。
在上述的減法運(yùn)算中,雖然可以得到運(yùn)算的結(jié)果。但是親們發(fā)現(xiàn)了沒。數(shù)值6根本就沒有在結(jié)果中顯示出來。
所以為了解決上述問題。由-3 轉(zhuǎn)換成 +12的 過程中,數(shù)值改變了15. 但是,15這個(gè)數(shù)值 效果,不能等價(jià)于 時(shí)鐘運(yùn)算中的 12小時(shí)。 所以要將反碼進(jìn)行+1之后再進(jìn)行計(jì)算。
即 -3的補(bǔ)碼=反碼+1=0001 1100 +1=0001 1101
之后的運(yùn)算:0000 1001+0001 1101=00101010 數(shù)值為+6
符號(hào)位,發(fā)生變化 偶數(shù) 仍為正數(shù)。
現(xiàn)在懂了什么叫補(bǔ)碼了吧。補(bǔ)碼,你還記得什么叫補(bǔ)角嗎?這個(gè)跟那個(gè)意思一樣,就是湊一塊就圓滿了。
補(bǔ)碼就是 在原碼的基礎(chǔ)上,找到那個(gè) 與他正好互補(bǔ),以便形成一個(gè)符號(hào)位的數(shù)。
最簡(jiǎn)單的獲取方式:原碼-〉反碼 然后+1
在計(jì)算機(jī)的運(yùn)算中,也要處理小數(shù)的運(yùn)算。即所謂的浮點(diǎn)數(shù)。
上次某同學(xué)問我,這個(gè)題怎么 0.1+0.1=1啊 。這明顯就是一個(gè)坑啊。利用人們已經(jīng)形成的十進(jìn)制思想,導(dǎo)致想不通。
在學(xué)習(xí)這個(gè)問題之前,首先要說一下,在10進(jìn)制的小數(shù)中,是怎么定義的。
0.1 0.01 分別代表什么。
十進(jìn)制中,每個(gè)位置所代表的權(quán)重都是不同的。
比如100 中的 1,所代表的就是 10^2
那么,0.01中的1代表的是什么? 很顯然 這個(gè)小數(shù)里面的1 所代表的是 10^-2
同樣的,十進(jìn)制的數(shù)值每個(gè)位置都有自己的權(quán)重。那么在2進(jìn)制的數(shù)值中。每個(gè)數(shù)也都有自己的權(quán)重。
0.1 很明顯就是 2^-1 了。 那么0.1+0.1 …… 你的世界觀還沒被毀……
至于浮點(diǎn)數(shù)的運(yùn)算,我就不
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)