编程判断整数运算溢出--减法

整数相减溢出判断

有符号整数相减

异号相加不会溢出,而同号相减相当于异号相加,故不会溢出;异号相减,正常情况结果都与被减数同号,所以从次判断是否溢出。而判断符号是否相同,即判断有符号整数的符号位是否相同,故采用位运算进行判断。(只需关心符号位即可)所以转化为判断:当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;
}

(论文)参考链接:https://patents.google.com/patent/CN103399780A/zh

posted @ 2022-03-12 20:27  hyq2  阅读(540)  评论(0编辑  收藏  举报