定點(diǎn)數(shù)的加減乘除

定點(diǎn)數(shù)的加減其實(shí)可以歸為一類。

定點(diǎn)加減

定點(diǎn)加減運(yùn)算主要用到補(bǔ)碼運(yùn)算。

加法表達(dá)式為[X+Y]補(bǔ)=[X]補(bǔ)+[Y]補(bǔ);就是說X+Y補(bǔ)碼的結(jié)果為X的補(bǔ)碼加上Y的補(bǔ)碼,即結(jié)果為補(bǔ)碼。

減法表達(dá)式為[x-y]補(bǔ)=[X]補(bǔ)+[-Y]補(bǔ);就是說X-Y的補(bǔ)碼結(jié)果就是用加法表示的,是用X的補(bǔ)碼和-Y的補(bǔ)碼相加得到的。[-Y]補(bǔ)等于[Y]補(bǔ)各位取反,包括符號(hào)位,然后加1就得到了。

溢出

溢出就是給定一個(gè)固定的容器,容器里盛裝的液體溢出來了,我就不多解釋了。計(jì)算機(jī)中的溢出就是給了你一個(gè)固定的位數(shù)去盛放位數(shù),某個(gè)數(shù)在這個(gè)容器里裝不下了就是溢出。定點(diǎn)數(shù)的加減運(yùn)算就會(huì)出現(xiàn)這種情況。

那么如何判斷加減溢出,粗糙的方法是正正相加為負(fù)溢出,負(fù)負(fù)相加為正溢出,正-負(fù)為負(fù)溢出,負(fù)-正為正溢出。

高端操作判斷溢出有個(gè)名字:變形補(bǔ)碼法,其實(shí)特別簡(jiǎn)單,既可以看出溢出,也可以看出溢出的方向,是向正數(shù)方向溢出了還是負(fù)數(shù)方向溢出了,一目了然。

就是符號(hào)位用雙符號(hào)位表示就可以啦,就這么簡(jiǎn)單。符號(hào)位為00、11為正負(fù)數(shù),若出現(xiàn)01、10則溢出了。01為上溢,10為下溢了。

定點(diǎn)數(shù)的乘法運(yùn)算

主要有原碼一位乘、補(bǔ)碼一位乘。

原碼一位乘

符號(hào)位不參加運(yùn)算,數(shù)值位均以絕對(duì)值出現(xiàn),X*Y中X為被乘數(shù),采用雙符號(hào)位,Y為乘數(shù),采用單符號(hào)位。部分積初始化為0。然后接下來的操作就是for循環(huán)了。

for(y的最低位;該位沒有超出y最高位;y的下一位)

{ 若y該位為1,部分積+X的絕對(duì)值,生成的新的部分積右移一位;

若y該位為0,部分積+0,生成的新的部分積右移一位;

}

結(jié)果表示:X符與Y符的異或產(chǎn)生的符號(hào)作為結(jié)果的符號(hào)。


原碼一位乘例子

補(bǔ)碼一位乘

符號(hào)位參與運(yùn)算。

X*Y中,被乘數(shù)采用雙符號(hào)位,乘數(shù)采用單符號(hào)位,乘數(shù)的最低位后添加上一個(gè)附加位,附加位值為0,仍然存在部分積。

for(y的最右邊兩位(初始的話為附加位與原來的最低位);y的兩位不是小數(shù)點(diǎn)左右兩邊的數(shù);y向左挪動(dòng)兩位)

{?

若y的兩位為00或11,則部分積+0,新的部分積右移兩位;

若y的兩位為01,則部分積+[X]補(bǔ),新的部分積右移兩位;

若y的兩位為10,則部分積+[-X]補(bǔ),新的部分積右移兩位;

}


補(bǔ)碼一位乘例子

其實(shí)到這了現(xiàn)在,應(yīng)該會(huì)發(fā)現(xiàn)原碼一位乘與補(bǔ)碼一位乘很相似,部分積都是要移動(dòng)n次(即X、Y的最高有效位個(gè)數(shù))。

定點(diǎn)數(shù)的除法運(yùn)算


原碼恢復(fù)余數(shù)法運(yùn)算

符號(hào)位不參與運(yùn)算,在X/Y中,X、Y的絕對(duì)值的補(bǔ)碼需要。雙符號(hào)位補(bǔ)碼運(yùn)算。

步驟:for(i=1;i<=X、Y的最高有效位個(gè)數(shù);i++)

{

判斷X>Y?

如果X>Y,商1,生成結(jié)果左移1位;

如果X<Y,商0,生成結(jié)果+Y絕對(duì)值補(bǔ)碼,生成的結(jié)果左移1位;

}

結(jié)果為:商,余數(shù),上述中最后生成的結(jié)果就是余數(shù)的尾數(shù),余數(shù)由尾數(shù)與階碼表示,階碼一般為負(fù)數(shù),左移幾次就是幾,例如:M*2的-5次方,就是余數(shù)產(chǎn)生左移了5次。

由于符號(hào)位不參加運(yùn)算,最后商的符號(hào)為X、Y的符號(hào)異或產(chǎn)生,余數(shù)的符號(hào)與被除數(shù)的符號(hào)相同。


原碼恢復(fù)余數(shù)法例子

原碼不恢復(fù)余數(shù)法運(yùn)算

符號(hào)位不參加運(yùn)算,參與運(yùn)算的是絕對(duì)值的補(bǔ)碼加減。整個(gè)過程類似一個(gè)循環(huán)的判斷。假設(shè)余數(shù)最初為被除數(shù)。

判斷:余數(shù)>除數(shù),商1,結(jié)果左移1位,新生成的余數(shù)-除數(shù);

余數(shù)<除數(shù),商0,結(jié)果左移一位,新生的余數(shù)+除數(shù);

該判斷需要左移n次(即參與運(yùn)算的數(shù)的有效位的個(gè)數(shù))。若左移第n次產(chǎn)生的余數(shù)為負(fù),需加上除數(shù)使余數(shù)為正。余數(shù)的符號(hào)與被除數(shù)的符號(hào)一致。

補(bǔ)碼一位除

補(bǔ)碼一位除設(shè)計(jì)到校正問題,此處只針對(duì)精度不嚴(yán)格的除法。

運(yùn)算:補(bǔ)碼雙符號(hào)位的加減。

規(guī)則:被除數(shù)(余數(shù))與除數(shù)同號(hào),被除數(shù)(余數(shù))-除數(shù),若異號(hào),被除數(shù)(余數(shù))+除數(shù);新生成的余數(shù)如果與除數(shù)同號(hào),商1,結(jié)果左移一位;若新生成的余數(shù)如果與除數(shù)異號(hào),商0,結(jié)果左移一位。如此往復(fù),直到左移發(fā)生了n次(即被除數(shù)、除數(shù)的有效位個(gè)數(shù))。

值得注意的是:最后一次上商,無論余數(shù)與除數(shù)是否同號(hào),均商1。

到了現(xiàn)在,可以發(fā)現(xiàn),原碼的乘除沒有符號(hào)位直接參與運(yùn)算,因而都是對(duì)絕對(duì)值進(jìn)行操作的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容