南京大学计算机系统基础课程笔记4:乘除运算及浮点数运算
4.1 整数乘法运算
通常在高级语言中两个n位整数相乘得到的结果通常也是一个n位整数(2n位乘积中的低n位)
参与乘法的两个数据类型相同,如果不同会先转换。
对于无符号乘法,判断高n位是否都等于0,是则不溢出;对于带符号乘法,判断高n位是否每位都等于低n位的最高位,是则不溢出。或者可以判断低n位与两个输入之间的关系,如上图所示。
因为无符号和带符号处理不同,对应的乘法指令也不同。
因为乘法指令所需的时钟时间长,所以在编译器处理乘法时,往往通过移位运算和加减法运算来代替组合运算(移位和加减法通常只需要一个或者更少的时钟周期)。
4.2 整数除法运算
整数除法的商一定小于被除数,所以不会发生溢出。
按照整数除法,正数商取比自身小的最接近整数(Floor),负数商取比自身大的最接近整数(Ceiling)。
整数除法时,除数不能为零(机器数无法表示),如果为零就调用异常处理程序。
除法运算更加复杂(30个以上的时钟周期,并且不能用流水线实现),所以在编译器中常使用右移运算实现(处理除数为2的倍数的情况时)。
不能整除时,采用下面两个截断方式:
- 无符号数、带符号正整数(地板):移出的低位直接丢弃
- 带符号负整数(天板):加偏移量(2^k - 1),然后再右移k位,低位截断(K是右移位数)
4.3 浮点加减运算&浮点运算的精度
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.