(1)无符号整形加法:
对于32位表示的任意无符号整形x(xw-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;另外,由于a、b∈[0, 2w-1],所以s=a+b-2w < a
代码表示为
bool is_overflow(unsigned a, unsigned b)
{
unsigned s = a + b;
return s < a;
}
(2)无符号整形减法:
对于32位表示的任意无符号整形x(xw-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位表示的任意无符号整形x和y,设z=x*y,则z∈[0,(2w-1)2],要完整的表示z需要2w位,此时会发生溢出,操作系统会将z截断至w位,因此有
z =(x*y)mod2w。
(4)无符号整型的除法运算:
对于除法运算,需要注意的是被除数不能为0(这种情况不会视为溢出,而是作为异常中断来处理),且除法的结果总是舍入到0。
这篇博客深入探讨了无符号整型在加法、减法、乘法和除法运算中的行为。针对加法,介绍了如何判断是否发生溢出,并提供了代码示例。减法通过转换成加法来处理。乘法会因数值范围超出而截断,并用模运算表示。除法中,被除数为0被视为异常而非溢出,结果始终向0舍入。
4181

被折叠的 条评论
为什么被折叠?



