加减运算溢出判断
加減運算&溢出判斷
- 加減運算
- 原碼
- 補碼
- 符號擴展
- 溢出判斷
加減運算
原碼
- 加法:先判符號位。若相同,則絕對值相加,結果符號位不變。若不同,做減法,絕對值大的減去絕對值小的數,結果符號位與絕對值大的相同。
- 減法:減數符號取反做加法運算。*注意機器字長,當左邊位出現溢出時,將溢位丟掉。
補碼
參與運算的操作數均用補碼表示
菜雞筆記:正數補碼與原碼相同,負數補碼取反加1
二進制規則運算,逢二進一
符號位與數值位按同樣的規則運算一起參與運算,符號位產生的進位要丟掉,結果的符號位由運算得出
運算公式:[A+B]補=[A]補+[B]補(mod M)
[A-B]補=[A]補+[-B]補(mod M)
mod M運算是為了將溢出位丟掉
*菜雞筆記:mod運算 求余運算 mod2即模2運算
模運算的性質:帶余除法——設 x,m∈Z,m>0,則存在唯一決定的整數q(商)和r(余數),使得 x=qm+r,0<=r<m
19 mod 12 = 7(及19/12=1…7)
-3 mod 12 = 9 (-3對12取模為9)
9 mod 12 = 9 (9對12取模為9)
在模12的條件下,-3等價于9,|-3|+|9|=12
-3 mod 12 = r
-3 = (-1) * 12 + 9
9 mod 12 = r
9 = 0 * 12 +9 (mod12把整數分為12類余數(0~11),余數相同的為同類等價。)
補碼運算結果亦為補碼
【例】設機器字長為8位(含一位符號位),A = 15,B = 24.求[A+B]補,[A-B]補。
解:
A = +15 = 00001111 B = +24 = 00011000;得[A]補 = 00001111 [B]補 = 00011000
[A + B]補=[A]補 + [B]補=00100111,其符號位為0,對應的真值為+39
[-B]補=11101000
[A - B]補 = [A]補 + [-B]補= 11110111,其符號為1,對應的真值為-9
注意負數,原碼與補碼轉換:取反加1
符號擴展
在計算機算數運算中,有時必須把采用給定位數表示的數轉換成具有不同位數位數的某種表現形式。
int–>long 短數據變為長數據。
e.g. 8位–>16位。正數(原、反、補碼的形式都一樣)原有形式的符號都移到新形式的符號位上,新表示形式的所有附加位都用0進行填充。
定點整數的符號擴展:在原符號位和數值位中間添加新位,正數都添0;負數原碼添0,負數反、補碼添1
定點小數的符號擴展:在原符號位和數值位后面添加新位,正數都添0;負數原、補碼添0,負數反碼添1
溢出判斷
key:`正+正=負(上溢)、負+負=正(下溢)
- 一位符號位,參加操作的兩個數符號相同,結果又與原操作數符號不同,則表示結果溢出
菜雞筆記:AB:與&&、A+B:或||、非 !
設A的符號為As,B的符號為Bs,運算結果的符號為Ss,則邏輯溢出表達式為:
若V = 0,表示無溢出;若V = 1,表示有溢出。
- 雙符號位(模4補碼)
運算結果的兩個符號位Ss1Ss2相同,表式未溢出;否則溢出,此時最高位符號代表真正的符號。(實際存儲時,只存儲一個符號位,運算時會復制一個符號位)
(1)Ss1Ss2 = 00:表示結果為正數,無溢出
(2)Ss1Ss2 = 01:表示結果正溢出(上溢)
(3)Ss1Ss2 = 10:表示結果負溢出(下溢)
(4)Ss1Ss2 = 11:表式結果為負數,無溢出
邏輯表達式為:V = Ss ⊕ S1
V = 0,無溢出;V = 1,有溢出。 - 采用一位符號位根據數據位的進位情況判斷
若符號的進位Cs與最高位數的進位C1相同,則說明沒有溢出。溢出的邏輯判斷表達式為V = Cs ⊕ C1,若V = 0,無溢出;V=1,有溢出。
`
總結
- 上一篇: vue+elementUI动态生成表格列
- 下一篇: Matlab 科研绘图汇总