编程判断整数运算溢出--减法
整数相减溢出判断
有符号整数相减
异号相加不会溢出,而同号相减相当于异号相加,故不会溢出;异号相减,正常情况结果都与被减数同号,所以从次判断是否溢出。而判断符号是否相同,即判断有符号整数的符号位是否相同,故采用位运算进行判断。(只需关心符号位即可)所以转化为判断:当x,y符号不同时,x-y的结果与被减数x符号不同则发生有符号整数溢出。
无符号整数相减
sub(x,y)(默认x>y情况):x<y,正常情况为负数,故溢出;x-y正常情况,结果小于x(减数),故判断x-y<x。
测试代码
#include<stdio.h>
//0~4294967295
//-2147483648~2147483647
int sub1(int x,int y)
{
printf("z=%d\n",x-y);
if(((x-y)^x&(x^y))<0)
printf("有符号整数溢出\n");
else
printf("有符号整数未溢出\n");
return 0;
}
int sub2(int x,int y)
{
printf("z=%u\n",x-y);
if(x<y||x-y>x)
printf("无符号整数溢出\n");
else
printf("无符号整数未溢出\n");
return 0;
}
int main()
{
sub1(2147483647,-1);
sub2(1,4294967295) ;
return 0;
}