定點(diǎn)數(shù)的加減其實(shí)可以歸為一類蛙酪。
定點(diǎn)加減
定點(diǎn)加減運(yùn)算主要用到補(bǔ)碼運(yùn)算已亥。
加法表達(dá)式為[X+Y]補(bǔ)=[X]補(bǔ)+[Y]補(bǔ)炼团;就是說(shuō)X+Y補(bǔ)碼的結(jié)果為X的補(bǔ)碼加上Y的補(bǔ)碼,即結(jié)果為補(bǔ)碼击吱。
減法表達(dá)式為[x-y]補(bǔ)=[X]補(bǔ)+[-Y]補(bǔ)泼返;就是說(shuō)X-Y的補(bǔ)碼結(jié)果就是用加法表示的,是用X的補(bǔ)碼和-Y的補(bǔ)碼相加得到的姨拥。[-Y]補(bǔ)等于[Y]補(bǔ)各位取反,包括符號(hào)位渠鸽,然后加1就得到了叫乌。
溢出
溢出就是給定一個(gè)固定的容器,容器里盛裝的液體溢出來(lái)了徽缚,我就不多解釋了憨奸。計(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茫因。然后接下來(lái)的操作就是for循環(huán)了。
for(y的最低位杖剪;該位沒(méi)有超出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的最右邊兩位(初始的話為附加位與原來(lái)的最低位)砰琢;y的兩位不是小數(shù)點(diǎn)左右兩邊的數(shù)蘸嘶;y向左挪動(dòng)兩位)
{?
若y的兩位為00或11良瞧,則部分積+0,新的部分積右移兩位训唱;
若y的兩位為01褥蚯,則部分積+[X]補(bǔ),新的部分積右移兩位况增;
若y的兩位為10赞庶,則部分積+[-X]補(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ù)法運(yùn)算
符號(hào)位不參加運(yùn)算泰讽,參與運(yùn)算的是絕對(duì)值的補(bǔ)碼加減例衍。整個(gè)過(guò)程類似一個(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ì)到校正問(wèn)題端衰,此處只針對(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ù))涎才。
值得注意的是:最后一次上商鞋既,無(wú)論余數(shù)與除數(shù)是否同號(hào),均商1耍铜。
到了現(xiàn)在邑闺,可以發(fā)現(xiàn),原碼的乘除沒(méi)有符號(hào)位直接參與運(yùn)算棕兼,因而都是對(duì)絕對(duì)值進(jìn)行操作的陡舅。