定點(diǎn)數(shù)的表示和運(yùn)算(原碼、補(bǔ)碼、移碼及加減乘除)
第一次擼筆記,難免有錯(cuò)誤,歡迎在評論區(qū)指出

1.?定點(diǎn)數(shù):小數(shù)點(diǎn)位置固定(即日常的計(jì)數(shù)操作,如1.23)
浮點(diǎn)數(shù):小數(shù)點(diǎn)位置不固定(比如科學(xué)計(jì)數(shù)法)
2.

3.?無符號數(shù)(通常只討論整數(shù)):整個(gè)機(jī)器字長的全部二進(jìn)制均為數(shù)值位,沒有符號位,相當(dāng)于數(shù)的絕對值。表示范圍:8位二進(jìn)制數(shù),2^8種不同狀態(tài),0000 0000—1111 1111即0—255
n位無符號數(shù)表示范圍:0—2^(n-1)
4.?有符號數(shù)的定點(diǎn)表示,數(shù)值部分也稱尾數(shù)

5.?原碼:用尾數(shù)表示真值的絕對值,符號位0-正 1-負(fù)
若機(jī)器字長為n+1位,則尾數(shù)占n位(下圖第一行表示“位權(quán)”,逗號表示定點(diǎn)小數(shù),小數(shù)點(diǎn)表示定點(diǎn)小數(shù))


6.?反碼:符號位為0,與原碼相同;符號位為1,則數(shù)值位全部取反。整數(shù)與小數(shù)表示范圍與原碼一致。反碼只是原碼轉(zhuǎn)變成補(bǔ)碼的中間狀態(tài),沒啥用。
7.?補(bǔ)碼:正數(shù)的補(bǔ)碼=原碼 ?負(fù)數(shù)的補(bǔ)碼=反碼末位+1(要考慮進(jìn)位)
補(bǔ)碼中+0和-0是同一種表示形式,故表示范圍比原碼多一個(gè)數(shù)(如下圖,暫且理解 為這個(gè)數(shù)就是這樣規(guī)定的,歡迎補(bǔ)充)
?

8.?負(fù)數(shù)補(bǔ)碼轉(zhuǎn)化為原碼:全部取反,末位+1,正數(shù)跟原來一樣(即補(bǔ)碼和原碼互相轉(zhuǎn)化方法相同)
9.?移碼(只能表示整數(shù)):補(bǔ)碼的符號位取反,表示范圍與補(bǔ)碼相同
10.?如果把移碼的符號位當(dāng)數(shù)值看的話,移碼的遞增對應(yīng)真值的遞增(二進(jìn)制和十進(jìn)制轉(zhuǎn)化不對應(yīng),只是對應(yīng)遞增關(guān)系)。移碼的作用:移碼表示的整數(shù)方便對比大小
?

11.??原碼反碼補(bǔ)碼表示范圍和轉(zhuǎn)化方法總結(jié)
?


12.?加減運(yùn)算:為了省錢,把減的想辦法變成加的。這里想到了模運(yùn)算(想象一下時(shí)鐘)?;檠a(bǔ)數(shù)的兩個(gè)數(shù)絕對值之和等于模。模-|a|=a的補(bǔ)數(shù)(補(bǔ)碼原本的定義)。如果計(jì)算機(jī)是8bit,說明計(jì)算機(jī)運(yùn)算時(shí)會天然地mod 2^8 ,也就是說計(jì)算機(jī)可以把所有整數(shù)映射到0—2^8-1之間,此時(shí)原碼減原碼可以轉(zhuǎn)化為原碼加補(bǔ)碼。這也就是補(bǔ)碼的作用,讓減法操作轉(zhuǎn)變?yōu)榧臃ú僮鳎珹LU無需集成減法器,節(jié)省硬件成本。執(zhí)行加法操作時(shí),符號位一起參與運(yùn)算。
公式:[A]補(bǔ)+[B]補(bǔ)=[A+B]補(bǔ);[A-B]補(bǔ)=[A]補(bǔ)+[-B]補(bǔ)
13.?溢出:對補(bǔ)碼進(jìn)行加法運(yùn)算容易導(dǎo)致溢出,溢出有三種判斷方法,核心邏輯均為兩個(gè)同號的數(shù)相加最終得到了異號的結(jié)果。
?


上溢:正+正=負(fù) ?下溢:負(fù)+負(fù)=正
方法一:幾個(gè)字母連在一起表示與運(yùn)算,+表示或運(yùn)算,上橫線表示非運(yùn)算。方法一本質(zhì)上也是“上溢:正+正=負(fù) ?下溢:負(fù)+負(fù)=正”的邏輯表達(dá)式的形式。搞出這個(gè)式子是為了方便邏輯電路(與門、或門、非門)實(shí)現(xiàn)。
?

方法二:我的評價(jià)是不如方法三(其實(shí)道理差不多)
?

(方法三比較重要)實(shí)際儲存時(shí),只儲存一個(gè)符號位,只有在運(yùn)算時(shí)多復(fù)制一個(gè)符號位。運(yùn)算結(jié)果中兩個(gè)符號位,前一個(gè)表示正確的符號,后一個(gè)表示實(shí)際算得的符號。運(yùn)算結(jié)果兩個(gè)符號位數(shù)字相同說明沒溢出,不同說明有溢出。雙符號位補(bǔ)碼又稱模4補(bǔ)碼,單符號位補(bǔ)碼又稱模2補(bǔ)碼。
14.??符號擴(kuò)展:int—long 短數(shù)據(jù)—長數(shù)據(jù)
?

15.?移位運(yùn)算:通過改變各個(gè)數(shù)碼位和小數(shù)點(diǎn)的相對位置,從而改變各個(gè)數(shù)碼位的位權(quán),可利用移位運(yùn)算實(shí)現(xiàn)乘法除法。由于位數(shù)有限,有時(shí)無法用算數(shù)移位精確地等效乘除法。
16.?原碼的算數(shù)移位
?



17.?反碼的算數(shù)移位
?

18.?補(bǔ)碼的算數(shù)移位

19.?循環(huán)移位:直接移,被移出的補(bǔ)上空缺,帶進(jìn)位位的也一樣。
20.?邏輯移位:左移右移都補(bǔ)零,移出的舍棄。
21.?原碼的乘法運(yùn)算:乘法運(yùn)算實(shí)際上是通過移位+加法運(yùn)算實(shí)現(xiàn)。首先回憶一下運(yùn)算器是個(gè)啥子。。
?

乘法運(yùn)算實(shí)現(xiàn):原碼一位乘法(因每次移一個(gè)位而得名)
(1)符號位的處理:符號位單獨(dú)處理,兩個(gè)數(shù)的符號位進(jìn)行異或運(yùn)算,數(shù)值位取絕對值進(jìn)行乘法運(yùn)算。
(2)計(jì)算之前把ACC清零。乘數(shù)存在MQ,被乘數(shù)存在X。圖中標(biāo)深灰色的位為當(dāng)前參與運(yùn)算的位。如果當(dāng)前運(yùn)算的位為1,則ACC加上被乘數(shù);如果當(dāng)前運(yùn)算的位為0,則ACC加上0;進(jìn)行完一次加法操作后將ACC和MQ中的數(shù)據(jù)統(tǒng)一邏輯右移一位(為了給數(shù)錯(cuò)位相加搞的操作),即ACC的最低位會移到MQ的最高位,然后在ACC最高位補(bǔ)0。而原MQ的最低位已經(jīng)被移出計(jì)算器,即被丟棄了。再次判斷MQ新的最低位是0還是1,開始新一輪計(jì)算。一直這樣先加法,后移位,重復(fù)n次。移到MQ中乘數(shù)只剩最后一位的時(shí)候停止(剩下那個(gè)是符號位,前面已經(jīng)異或過了,不用再算)。若是定點(diǎn)小數(shù),小數(shù)點(diǎn)隱含在符號位后面的位置。若是定點(diǎn)整數(shù),小數(shù)點(diǎn)隱含在MQ最右邊一格前面的位置。


?
?
(3)原碼一位乘法(手算):使用單符號位、雙符號位都可以,但是由于補(bǔ)碼一位乘法需要雙符號位,所以直接干脆全都用雙符號位就好。若是定點(diǎn)小數(shù),分開符號位和數(shù)值位使用英文句號。若是定點(diǎn)整數(shù),則使用逗號。
?

22.??補(bǔ)碼一位乘法
?

補(bǔ)碼這個(gè)最低位打引號是因?yàn)樗皇钦嬲淖畹臀?,MQ最低位是輔助位。最后多來一次加法會讓乘數(shù)的符號位也參與運(yùn)算。
?

?
23.?(惡心人的)原碼除法:
(1)恢復(fù)余數(shù)法:符號位的處理:符號位單獨(dú)處理,兩個(gè)數(shù)的符號位進(jìn)行異或運(yùn)算,數(shù)值位取絕對值進(jìn)行除法運(yùn)算。MQ灰色位置是當(dāng)前要上商的位置,計(jì)算機(jī)會先默認(rèn)上1,如果發(fā)現(xiàn)余數(shù)的符號位為1,即余數(shù)是負(fù)數(shù),則說明上商1是錯(cuò)誤的(下圖1),應(yīng)改為上商0,并恢復(fù)原有的余數(shù),即把ACC減掉的除數(shù)再加回去(下圖2)。 如果發(fā)現(xiàn)余數(shù)的符號位為0,則說明余數(shù)是正的,上商1是對的。(中間綠色框這個(gè)ACC+[-|y|]補(bǔ)→ACC這個(gè)操作其實(shí)我不太明白為啥是-|y|,為啥是減號,我只能想到一種解釋就是[|x|-|y|]原=[|x|-|y|]補(bǔ)=[|x|]補(bǔ)+[-|y|]補(bǔ)其中第一個(gè)等號成立的條件是|x|-|y|為正,即商一能成功的時(shí)候,第二個(gè)等號依據(jù)是減法公式)
?


?
進(jìn)行完一次這波操作以后ACC,MQ整體邏輯左移,ACC高位丟棄,MQ低位補(bǔ)0。然后繼續(xù)在灰色格子確定一位商。下圖是假定機(jī)器字長只有五位,故只能計(jì)算五位的商。下圖為定點(diǎn)小數(shù)的除法運(yùn)算,小數(shù)點(diǎn)隱含在符號位后面。
?


下圖為手算過程
?

(2)加減交替法(不恢復(fù)余數(shù)法):相比恢復(fù)余數(shù)法有一個(gè)優(yōu)化的地方就是如果商1后余數(shù)是負(fù)數(shù),讓余數(shù)邏輯左移再加上[|y|]補(bǔ)即可。

24.?補(bǔ)碼的除法運(yùn)算:加減交替法(直接貼ppt了)


?
?