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

这篇博客深入探讨了无符号整型在加法、减法、乘法和除法运算中的行为。针对加法,介绍了如何判断是否发生溢出,并提供了代码示例。减法通过转换成加法来处理。乘法会因数值范围超出而截断,并用模运算表示。除法中,被除数为0被视为异常而非溢出,结果始终向0舍入。
部署运行你感兴趣的模型镜像


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

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值