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