C++:防止int32溢出--以反转数字为例

int32溢出

  • 在C++等语言中int类型的整数占4个字节(一般而言),而一个字节是8bit,所以int型可表示32位的整数,又因为int可以表示负数,所以int的范围是 − 2 31 -2^{31} 231~ 2 31 2^{31} 231-1
  • 如果用数字表示,就是:-2147483648 ~ 2147483647
  • 而在C++里可用关键字INT_MAXINT_MIN表示上述的int上限和int下限

溢出的后果

  • 对于int型的溢出,编译器可能会依二进制计算结果根据补码的规则得到一个错误的结果
  • 可能造成缓冲区溢出、未知的逻辑错误

防止int32溢出

错误的思路:判断一个int是否大于INT_MAX或小于INT_MIN

如果int已经溢出,编译器要么会报错,要么会处理这个数字使其处于int允许的范围内(当然这不是我们想要的数字),所以这样的比较没有意义,无法判断是否溢出。

正确的思路:在无法判断一个操作是否会造成溢出时,在操作之前加一个判断语句。判断什么呢?打个比方,我们要进行 a+b 的操作(a,b>0),但我们无法判断 a+b 是否会溢出,正如前面所说,我们不能通过 a+b>INT_MAX 这种方式去判断,但是可以转换一下思路,判断 a>INT_MAX-b 是否为真,若为真,a+b会溢出,否则不会

可能面对具体问题的时候需要一点微调和补充,但基本的思路就是这样,万变不离其宗。

示例

这里给出一个程序用作示例,这是一个很经典的问题–将一个数字反转,转换很简单,现在考虑的是如何防止倒置过程中发生溢出。规定如果发生溢出,返回0。

int reverse(int x) {
   	int ans = 0;
   	int temp = 0;
   	int r = 0;
   	if (x >= 0)
   		while (x) {
   			r = x % 10;
   			if (INT_MAX / 10 < temp) return 0;
   			temp = ans * 10;
   			if (INT_MAX - r < temp) return 0;
   			ans = temp + r;
   			temp = ans;
   			x /= 10;
   		}
   	else 
   		while (x) {
   				r = x % 10;
   				if (INT_MIN / 10 > temp) return 0;
   				temp = ans * 10;
   				if (INT_MIN - r > temp) return 0;
   				ans = temp + r;
   				x /= 10;
   				temp = ans;	
   	}
   	return ans;
   }

如有任何问题,欢迎与我交流

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值