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

整数相减溢出判断#

有符号整数相减#

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

无符号整数相减#

sub(x,y)(默认x>y情况):x<y,正常情况为负数,故溢出;x-y正常情况,结果小于x(减数),故判断x-y<x。

测试代码#

Copy Highlighter-hljs
#include<stdio.h>//0~4294967295//-2147483648~2147483647int 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 @   hyq2  阅读(575)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
CONTENTS