整数乘法运算
1、xy被转换为乘法指令,在乘法运算电路中得到的结果也是一个n位整数,也即结果只取2n位乘积中的低n位
2、在计算机内部,一个整数x的平方可能是负数,这是因为在计算机中其结果取的是xx的低n位乘积而高n位中的有效数位被丢弃而造成的。
/*
如何判断返回的z是正确值
*/
int mul(int x,int y)
{
int z = x*y;
return z;
}
//如何判断返回的z是正确值
!x || z / x == y 为真时
// 什么情况下,乘积是正确的呢?
当 -2^n-1 <= x*y < 2^n-1(不溢出)时
/*
即:乘积的高n位为全0或全1,并等于低n位的最高位
即:乘积的高n+1位为全0或全1
*/
/*
若x、y和z都改成unsigned类型,则判断方式为
*/
乘积的高n位为全0,则不溢出 编译器判断
!x || z / x == y 为真时 程序员写程序
带符号整数乘法
无符号整数乘法
整数乘运算的溢出漏洞
带符号整数加法溢出判断程序
整数除法运算
整数除法的规则
对于带符号整数来说,n位整数除以n位整数,除-2^(n-1)/-1=2 ^ (n-1)会发生溢出外,其余情况都不会发生溢出。Why?
因为商的绝对值不可能比被除数的绝对值更大,因而不会发生溢出,也就不会像整数乘法运算那样发生整数溢出漏铜。
因为整数除法,其商也是整数,所以,在不能整除时需要进行舍入,通常按照朝0方向舍入,即正数商取比自身小的最接近整数(Floor地板),负数商取比自身大的最接近整数(Ceiling,天板)。
整除0的结果可以用什么机器数表示?
整除0的结果无法用一个机器数表示
整数除法时,除数不能为0,否则会发生**“异常”**,此时,需要调出操作系统中的异常处理程序来处理。
整除操作中的异常情况
第一种:用objdump看代码段一的反汇编代码,得知除以-1被优化成取负指令neg,故未发生除法溢出
第二种:为什么显示是“浮点异常”呢?
变量和常数之间的除运算