原码/补码的加减运算and溢出判断
小數(shù)點(diǎn)的處理:
任意一個(gè)二進(jìn)制數(shù)S都可以表示為
研究小數(shù)點(diǎn)就要研究階碼E的取值:
- 若E=0,則表示純小數(shù)——代表定點(diǎn)小數(shù);
例0.1111表示+0.1111,1.1111表示-0.1111。 - 若E=n,則表示純正數(shù)——代表定點(diǎn)正數(shù);
例01111表示+1111,11111表示-1111。 - E=m,且0<m<n,小數(shù)點(diǎn)在中間n個(gè)數(shù)內(nèi)浮動——代表浮點(diǎn)數(shù)。
定點(diǎn)數(shù)的運(yùn)算:
1、運(yùn)算中,采用補(bǔ)碼來表示定點(diǎn)數(shù)。
| 符號位可以跟數(shù)值位一起參加運(yùn)算 |
| 可以用加法方便的實(shí)現(xiàn)減法運(yùn)算 |
| 0的表示是唯一的 |
| 可以多表示一個(gè)最小負(fù)數(shù) |
2、定點(diǎn)數(shù)的移位運(yùn)算
當(dāng)某二進(jìn)制數(shù)相當(dāng)于小數(shù)點(diǎn)做n位左移或者右移,相當(dāng)于該數(shù)乘以或者除以2^n。
由于機(jī)器數(shù)的字長都是固定的,當(dāng)機(jī)器數(shù)左移或者右移時(shí),都會造成n位低位或者n位高位出現(xiàn)空缺。
邏輯移位(無符號數(shù))
| 左移 | 高位移丟,低位補(bǔ)0 |
| 右移 | 低位移丟,高位添0 |
算術(shù)移位
例:設(shè)機(jī)器字長為8,A=+26
A=+26=+11010
[A]原=[A]補(bǔ)=[A]反=0,0011010
| 移位前 | 0,0011010 | +26 |
| 左移一位 | 0,0110100 | +52 |
| 左移兩位 | 0,1101000 | +104 |
| 右移一位 | 0,0001101 | +13 |
| 右移兩位 | 0,0000110 | +6 |
當(dāng)機(jī)器數(shù)為正,三碼相等,左移右移都補(bǔ)0 。
- 當(dāng)機(jī)器數(shù)為負(fù)
例:設(shè)機(jī)器字長為8,A=-26
[A]原=1,0011010
[A]補(bǔ)=1,1100110
[A]反=1,1100101
| 移位前 | 1,0011010 | -26 |
| 左移一位 | 1,0110100 | -52 |
| 右移一位 | 1,0001101 | -13 |
原碼——左移右移補(bǔ)0。
| 移位前 | 1,1100110 | -26 |
| 左移一位 | 1,1001100 | -52 |
| 右移一位 | 1,1110011 | -13 |
補(bǔ)碼——左移補(bǔ)0,右移添1。
| 移位前 | 1,1100101 | -26 |
| 左移一位 | 1,1001011 | -52 |
| 右移一位 | 1,1110010 | -13 |
反碼——左移右移都添1。
定點(diǎn)數(shù)的加/減運(yùn)算
1、原碼
- 加法規(guī)則:先判斷符號位,若相同,絕對值相加,結(jié)果符號位不變;若不同,則做減法,絕對值大的數(shù)減去絕對值小的數(shù),結(jié)果與絕對值大的數(shù)相同。(同號求和,異號求差)
- 減法規(guī)則:兩個(gè)原碼表示的數(shù)相減,首先將減數(shù)的符號取反,然后將被減數(shù)與符號取反后的減數(shù)按原碼加法進(jìn)行運(yùn)算。(同號求差,異號求和)
例:[x]原=0.1101,[y]原=1.1001,求[x+y]原、[x-y]原?
[x+y]原:
符號位不同,做減法:
[-y]原=0.0111
最高數(shù)值位產(chǎn)生進(jìn)位,所在數(shù)值位 .0100,再加上第一操作數(shù)的符號0
[x-y]原:
減數(shù)的符號取反,
因?yàn)閿?shù)值最高位產(chǎn)生進(jìn)位,結(jié)果正上溢。
2、補(bǔ)碼
- 補(bǔ)碼加法
兩個(gè)數(shù)的補(bǔ)碼相加,符號位參加運(yùn)算,且兩數(shù)和的補(bǔ)碼等于兩數(shù)的補(bǔ)碼之和。
例:x=+0.1011,y=-0.1001,求[x+y]補(bǔ)?
[x]補(bǔ)=0.1011 [y]補(bǔ)=1.0111
則:[x+y]補(bǔ)=0.1011+1.0111=0.0010(符號位進(jìn)位舍去)
即:[x+y]補(bǔ)=0.0010,真值為:+0.0010。
- 補(bǔ)碼減法
由于運(yùn)算器僅有加法器,則:
例:已知[x]補(bǔ)=0.0010,[y]補(bǔ)=1.1010,求[x-y]補(bǔ)?
[y]補(bǔ)=1.1010,則[-y]補(bǔ)=0.0110
則[x-y]補(bǔ)=0.0010+0.0110=0.1000。
3、特殊的情況——溢出(補(bǔ)碼)
| 原碼 | -127~127 |
| 補(bǔ)碼 | -128~127 |
| 反碼 | -127~127 |
- 溢出產(chǎn)生的原因:當(dāng)兩(小)數(shù)相加大于(1或)上界127,稱為上溢或者正溢出,兩(小)數(shù)相加小于(-1或)下界-128,稱為下溢或負(fù)溢出。
- 發(fā)生溢出,數(shù)值位擴(kuò)充,數(shù)值位“跑“到符號位,然后取代符號位。導(dǎo)致”兩正數(shù)相加等于負(fù)數(shù),兩負(fù)數(shù)相加等于正數(shù)“。
- 計(jì)算機(jī)判斷溢出的方法
①單符號——兩符號相同的運(yùn)算,運(yùn)算結(jié)果符號相反的為溢出。
| 加法:符號相同的兩數(shù)相加 |
| 減法:符號不同的兩數(shù)相減 |
②雙符號法(變形補(bǔ)碼法)——檢測正負(fù)溢出
特點(diǎn):
- 兩位符號位要聯(lián)同數(shù)值部分一起參加運(yùn)算。
- 高位符號位產(chǎn)生的進(jìn)位直接丟棄。
原則:
- 當(dāng)兩位符號位不同時(shí),表示溢出。
- 高位符號位永遠(yuǎn)代表真正的符號位。
正溢出
例:已知[x]補(bǔ)=00.1011,[y]補(bǔ)=00.0111,求[x+y]補(bǔ)=?
負(fù)溢出:
例:已知[x]補(bǔ)=11.0101,[y]補(bǔ)=11.1001,求[x+y]補(bǔ)=?
③當(dāng)兩個(gè)單符號:
當(dāng)兩個(gè)單符號位補(bǔ)碼進(jìn)行加減運(yùn)算時(shí),若最高數(shù)值號位向符號位的進(jìn)位值C與符號位產(chǎn)生的進(jìn)位輸出值S相同,則沒有溢出發(fā)生;如果兩個(gè)進(jìn)位值不同,則發(fā)生溢出。
判斷公式:C⊕S
例:已知[x]補(bǔ)=1.0101,[y]補(bǔ)=1.1001,求[x+y]補(bǔ)=?
例:已知[x]補(bǔ)=1.1000,[y]補(bǔ)=1.1000,求[x+y]補(bǔ)=?
《計(jì)算機(jī)組成原理》——唐朔飛
此次分享就到這里,歡迎大家指導(dǎo)指正~ 我是愛吃肉的小白yyyloki,如果你覺得不錯(cuò)的話點(diǎn)個(gè)贊👍吧!或者你可以關(guān)注,持續(xù)更新計(jì)組的內(nèi)容(ps:也許期末用的上)。我們下次見~886
總結(jié)
以上是生活随笔為你收集整理的原码/补码的加减运算and溢出判断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++中的有符号数与无符号数一起运算
- 下一篇: Android 彻底杀死当前进程