经常遇到一些情况,数据可能会超出最大值的,其实任何类型都有这个情况,只是整型最常用。x86上int型能够表示的范围是-2147483648~2147483647,占32位4个字节。
试验了下,发现运算器不会管你是否溢出,都会照常进行运算,只是溢出的进位到达了最前面的符号位或者更多进位的话就丢掉了。(这里说的是多数机器,有些机器会有一个溢出的状态,这种情况下运算并不是照常进行的)
之前曾经错误的以为,正整数运算超出上界就会导致结果是负的,实际情况是,相加运算在多数机器上常常如此,因为两个int相加最大也不会超过两倍的INT_MAX,于是它导致进位到符号位,结果就成了负的。由此可见,加法的溢出是可以判断的,如下,两个正整数相加:
- if ( a + b < 0 )
- //溢出
其实,这对于有溢出状态的机器来说是有问题的,所以更好的方法是:
- if( (unsigned)a + (unsigned)b > INT_MAX)
- //溢出
减法和加法类似,
但是乘法的话就不一定了,因为溢出的进位数可能会大于1,我记得x86电子计算机有一个状态字里是有是否溢出的标志位的,但是不知道怎么在代码里调用,之后再研究。
除法应该是不会溢出的。
Fortunately,目前见到的情形中,溢出判断都不是非要不可的,因为你可以想办法控制你的数据及结果在范围之内,就是在运算之前确保运算不会溢出,比如
加法你可以这样判断:
- if( a < INT_MAX - b )
- //运算a+b
类似的,乘法可以这样:
- if( a < INT_MAX / b )
- //运算a*b
也许之前的方法就不应该讨论,但是弄清了一直以来的一些疑惑,有顿悟的感觉,有所获...