unsigned整数相减溢出问题

平时工作中接触到的整数都是无符号整数,很少有整数溢出的业务场景,最近遇到个整数溢出问题,故专门写篇blog记录下,本文不会探究整数溢出背后的原理,是一篇总结溢出规律的文章,以4字节整数为例,探讨下unsigned整数相减溢出问题。
直接撸代码:)

#include <stdio.h>
int main()
{
	unsigned int a=0xffffffff+1;
	unsigned int b=0xffffffff-1;
	unsigned int c=a-b;
	printf("a=%x,b=%x,a-b=%x\n",a,b,c);
	
	a=0xffffffff+0xffffffff+1;
	b=0xffffffff+0xfffffffa-1;
	c=a-b;
	printf("a=%x,b=%x,a-b=%x\n",a,b,c);
	
	a=0xffffffff+0xffffffff+1;
	b=0xffffffff-1;
	c=a-b;
	printf("a=%x,b=%x,a-b=%x\n",a,b,c);
}

运行结果如下:

a=0,b=fffffffe,a-b=2
a=ffffffff,b=fffffff8,a-b=7
a=ffffffff,b=fffffffe,a-b=1

不管a,b值为多少,a-b=(a-b)%0xffffffff
只有a,b的实际差值小于0xffffffff时,a-b的值才正确,如果a,b的差值不超过0xffffffff,就算a,b本身值溢出,a-b仍能得到正确值。
当a,b的实际差值大于0xffffffff时,a-b的值并不是实际的差值,这种场景应该被重视,在实际业务场景下会出逻辑问题。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值