无符号整形的加减乘除运算

来源:互联网 发布:天正建筑t20 mac 编辑:程序博客网 时间:2024/05/01 10:49


1无符号整形加法:

对于32位表示的任意无符号整形xxw-1…x0),有x∈[0, 2w-1],则s=a+b∈[0, 2w+1-2],所以

1、当s∈[0, 2w-1]时,未发生溢出,s=a+b

2、当s∈[2w,2w+1-2]时,发生了正溢出,由于无符号整形只能由32位表示,所以当溢出发生时需要截断到32位,舍弃第w位,此时s=(a+b)%2w,即s=a+b-2w

 

那么,怎么判断两个无符号整形“+”操作发生了溢出?

 

当发生溢出时,s=a+b-2w∈[0, 2w-2],所以s≥0;另外,由于ab∈[0, 2w-1],所以s=a+b-2w < a

 

代码表示为

bool is_overflow(unsigned a, unsigned b)

{

unsigned s = a + b;

return s < a;

}

 

2无符号整形减法:

对于32位表示的任意无符号整形xxw-1…x0),有x∈[0, 2w-1]假设x的加法逆元是-x,则-x可以表示为

(I)-x=0,x=0

(II)-x=2w-x

 

则对于z=x-y,可以认为z=-y+x,则无符号整型的减法运算可以转换为无符号整型的加法运算。

 

3无符号整型的乘法运算:

对于32位表示的任意无符号整形xyz=x*y,则z∈[0(2w-1)2],要完整的表示z需要2w位,此时会发生溢出,操作系统会将z截断至w位,因此有

z =x*ymod2w

 

(4)无符号整型的除法运算:

对于除法运算,需要注意的是被除数不能为0(这种情况不会视为溢出,而是作为异常中断来处理),且除法的结果总是舍入到0

0 0