两个无符号整形相加时,可能会出现进位导致的数据溢出,如:0xffffffff+0x12—0xffffffff是无符号整形中的最大值即4,294,967,295,0xffffffff与任何数相加都会产生进位导致数据清空。
解决方案:使用两个变量来存储算式结果,其中存放高位的变量中的值1代表4,294,967,296,低位正常。
代码实现
#include<stdio.h>
void add(unsigned int a,unsigned int b,unsigned int *high,unsigned int *low)
{
*low=a+b; //进行正常的加法
if(*low < a || *low <b) //如果算式结果小于两数的任意一个数
{
*high=1;
}
else
{
*high=0;
}
}
int main(int argc, char const *argv[])
{
//调用函数并输出结果
unsigned int high,low,a,b;
a=0xffffffff;
b=0x2;
add(a,b,&high,&low);
printf("high=%u,low=%u\n",high,low);
a=0xffffffff;
b=0xf;
add(a,b,&high,&low);
printf("high=%u,low=%u\n",high,low);
return 0;
}