数据类型溢出的判断和控制

经常遇到一些情况,数据可能会超出最大值的,其实任何类型都有这个情况,只是整型最常用。x86上int型能够表示的范围是-2147483648~2147483647,占32位4个字节。

试验了下,发现运算器不会管你是否溢出,都会照常进行运算,只是溢出的进位到达了最前面的符号位或者更多进位的话就丢掉了。(这里说的是多数机器,有些机器会有一个溢出的状态,这种情况下运算并不是照常进行的)

之前曾经错误的以为,正整数运算超出上界就会导致结果是负的,实际情况是,相加运算在多数机器上常常如此,因为两个int相加最大也不会超过两倍的INT_MAX,于是它导致进位到符号位,结果就成了负的。由此可见,加法的溢出是可以判断的,如下,两个正整数相加:

  1. if ( a + b < 0 )
  2.    //溢出

其实,这对于有溢出状态的机器来说是有问题的,所以更好的方法是:

  1. if( (unsigned)a + (unsigned)b > INT_MAX)
  2.    //溢出

减法和加法类似,

但是乘法的话就不一定了,因为溢出的进位数可能会大于1,我记得x86电子计算机有一个状态字里是有是否溢出的标志位的,但是不知道怎么在代码里调用,之后再研究。

除法应该是不会溢出的。

Fortunately,目前见到的情形中,溢出判断都不是非要不可的,因为你可以想办法控制你的数据及结果在范围之内,就是在运算之前确保运算不会溢出,比如

加法你可以这样判断:

  1. if( a < INT_MAX - b )
  2.    //运算a+b

类似的,乘法可以这样:

  1. if( a < INT_MAX / b )
  2.    //运算a*b

也许之前的方法就不应该讨论,但是弄清了一直以来的一些疑惑,有顿悟的感觉,有所获...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值