1.计算机中小数数据是如何表示的呢?
原码,反码和补码可以实现正负整数的表示,但是对于小数部分却没办法表示。为了合理的表示小数,定点数确定了小数点的位置,固定了小数的位数,但是这样会导致范围分配不合理(比如我设置了很多的小数位数以至于我的整数位数剩余很少,现在我想表示一个很大的整数,则会出现问题),所以设置了浮点数,浮点数的小数点位数不固定,可以自由变动,虽然提高了表示范围,但也要更多的存储开销。两者各有利弊,并且具有各自的计算方式,但是大多都是在加法器的基础上进行了一定的修改。
2 补码
- 两个补码相加,等于相加取补码(减法相同)
- 正溢出:两个正数相加—负溢出
- 溢出的表现
1.数值的最高位和符号位只有一个进位;
2.使用双符号位,11表示正,00表示负,变成异号则溢出(10负溢出,01正溢出) - 补码加减法计算器
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200312143451332.png#pic_center)
3 移码
- 为什么要引入移码:为了在后续对阶时更加方便 2^-1和2 ^3 -1:111 3:011 如果直接使用补码,那么出现了错误,所以需要使用移码;移码的实质就是在原码之上加上一个最高位-1+4=3=011 3+4=7=111(比较大小,不分正负)
- 相加的移码=移码与补码的和
- 溢出的判断:双符号的最高符号位为1则溢出,低符号位为0,上溢
4 移位
- 逻辑移位:无符号数
- 算术移位:符号位不变
(1)右移都补零,可能会溢出
(2)左移针对情况,原码补零,补码符号位 反码左移正数补零,负数补一;右移符号位来补
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200312184353658.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk1ODcyOA==,size_16,color_FFFFFF,t_70)
5 定点数的运算
5.1 乘法
- 原码乘法:
(1)同10进制乘法:按位直接乘,结合右移
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200316135719607.png#pic_center)
(2)原码一位乘法:符号位单独计算,取两者的绝对值,将Y的倒数几位依次乘上|x|,并右移(先得到的是后面的y与x相乘的结果)。
- 补码乘法
(1)校正法:符号位单独处理,取小数部分,类似原码一位乘法,最后根据符号位是否为负数,决定要不要加上[-x]补
(2) Booth算法 :类似补码移位乘法,但本次要带上符号位(几位加几次),最后一位先补零,然后逆序取两位判断应该加啥,11/00不加…
5.2 除法
- 原码除法
(1)手工除法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200316152532728.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk1ODcyOA==,size_16,color_FFFFFF,t_70)
(2)恢复余数算法:除法分成余数(R)和商(Q),余数的符号取决于被除数的符号,商的符号取决于两者。重复(1)-(3)
(3)不恢复余数算法
![在这里插入图片描述](https://img-blog.csdnimg.cn/202003231937400.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk1ODcyOA==,size_16,color_FFFFFF,t_70)
6 浮点数
对阶(小阶靠向大阶),尾数计算(具体方法选择),规格化,舍入
- 加减
(1)0操作数检查
(2)对阶:小阶向大阶(避免左移)
(3)尾数加减
(4)规格化:
若尾数溢出,则右规一位(只能一次)
若尾数过小,则需要左规
(5)舍入:截断,0舍1入,末位恒置1