c语言 溢出时截断前面还是后面_C语言判断整数溢出

博客探讨了如何在C语言中有效地判断整型变量是否发生溢出。通过分析int类型的取值范围和补码表示,提出避免直接计算2^31的快速方法,如使用位运算。同时,提出了通过比较x/10与int_max/10及x的低位来规避溢出检测的陷阱。这种方法既避免了计算2^31的复杂性,又解决了溢出判断的准确性问题。
摘要由CSDN通过智能技术生成

本次讨论一个看似简单,其实内藏玄机的一个有意思的问题,即如何判定一个整型变量x是否溢出。

首先,先复习一下int的范围。int类型在C语言中占4个字节,即32个二进制位。当表示正数时,最高位为符号位(符号位为0),最大的正数是 0111 1111 1111 1111 1111 1111 1111 1111 即2^31 -1 = 2147483647。

当表示负数时,最高位为符号位(符号位为1),最小的负数是 1000 0000 0000 0000 0000 0000 0000 0000 而在计算机中是以补码的形式存储的,C语言规定 1000 0000 0000 0000 0000 0000 0000 0000 的补码为-2147483648

所以C语言中int的取值范围为:-2147483648 ~  2147483647。

有人可能要说,这里if语句不就能解决问题吗?例如:if(x>-2147483648&&x<2147483647)。然而,这里显然二点不妥。(1)你的如何短时间计算出2^ 31?(2)因为x是int型,即使x溢出,由于存储的限制,那么x的值也必然在这个区间范围内(这里不考虑类型升级)。所以这种判定是不科学的。

下面给出我的思路。

针对(1)如何快速计算2^ 31次方:简单粗暴的用16进制表示出来(),或者利用位运算。将最大值最小值记作int_max 和int_min。

针对(2)我们可以先比较x/10与int_max/10的大小, 再比较最后一位,即可避免上面的尴尬之处。

代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值