平时工作中接触到的整数都是无符号整数,很少有整数溢出的业务场景,最近遇到个整数溢出问题,故专门写篇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的值并不是实际的差值,这种场景应该被重视,在实际业务场景下会出逻辑问题。