一. 导入
0000 1110 —>14
1000 1110 ----> -14
1001 1100
-(4+8+16)= -28
如上所示,14-14 如果用正14和负14进行相加的话,得到的结果是不正确的。
如果用正14减去正十四,结果是正确的,但是要实现减法的话就得使用减法器,这样就会增加硬件成本。所以,我们可以将减法转换为加法运算!
二. 模运算的性质
10-3=7 -3mod12=9
10+9=19 19/12=1…7即19mod12=7
带余除法–设x, m∈Z,m>0则存在唯一决定的整数q和r,使得:x=qm+r,0<=r<m, r就是余数
1. -3 mod 12
-3 = (-1)*12+9
-
9 mod 12
9 = 0*12 +9
-
21 mod 12
21 = 1*12+9
-
-15 mod 12
-15 = (-2)*12+9
我们可以称 -3,9,21,33,-15是等价的,(mod 12)把所有的整数分为12类,余数为(0~11),mod 12 余数相同的数,都是同一类,都是等价的,即10+(-3), 10+9, 10+21…在(mod 12)的条件下效果是相同的。
因此,在(mod m)的条件下,若能找到负数的补数,就可以用正数的加法来等价代替减法
模-a的绝对值 = a的补数, 比如-3和9就是互为补数,因为二者绝对值之和等于模
a的补数就是a的补码,这样,补码就让减法转变为加法操作,节省硬件成本。
ps: 任何运算结果在(mod 28)后只保留最低8位
总结:
使用补码可以将减法操作转变为等价的加法,ALU中无需集成减法器,执行加法操作时,符号位一起参与运算.
三. 定点数的运算
(一) 移位运算
-
算数移位
机器数采用有符号数
符号位不参与移位-
原码的算数移位
1. 左移,右移都补0
2. 原码算术移位,左移丢1,运算出错,右移丢1,影响精度
-
反码的算数移位
- 正数的反码和原码相同,因此对正数反码的移位运算都是和原码相同的;右移,高位补0,低位舍弃; 左移,低位补0,高位舍弃
- 负数的反码的算数移位: 右移,高位补1,低位舍弃;左移,低位补1,高位舍弃
-
补码的算数移位
-
正数的补码和原码相同,因此对正数补码的移位运算都是和原码相同的;右移,高位补0,低位舍弃; 左移,低位补0,高位舍弃
-
负数的补码算数移位:负数补码=反码末尾+1导致反码最右边几个连续的1都因进位而变为0,直到进位遇到第一个1为止;规律:负数补码中,最右边的1及其右边同原码,最右边的1的左边同反码, 因此:右移, 高位补1,低位舍弃;左移,低位补0,高位舍弃
-
-
-
逻辑移位
机器数采用无符号数
-
循环移位
循环移位分为带进位标志位CF的循环移位(大循环), 和不带进位标志位的循环移位(小循环)
是否带进位则要看是否将进位标志位加入循环位移
循环移位操作特别适合将数据的低字节数据和高字节数据互换
(二) 定点数的加减运算
-
原码的加减运算
原码的加法运算:
正+正 -->绝对值做加法,结果为正, 可能会溢出
负+负 -->绝对值做加法,结果为负, 可能会溢出
正+负 --> 绝对值大的减绝对值小的,符号同绝对值大的数
负+正 -->绝对值大的减绝对值小的,符号同绝对值大的数
原码的减法运算, 将"减数"符号取反,转变为加法:
正-负 -->正+正
负-正 -->负+负
正-正 -->正+负
负-负–>负+正
-
补码的加减运算
设机器字长为n+1
-
参与运算的两个操作数均用补码表示
-
按二进制运
-