溢出分为向上溢出和向下溢出,也就是只能发生在符号相同的两个数相加
加法溢出
当 x y 都大于 0 的时候,可能向上溢出
如果 y > MAX_INT - x 说明溢出
当 x y 小于 0 时,可能向下溢出
如果 y < MIN_INT - x 说明溢出
func add(x,y) (rst, overflow)
if x > 0 && y > 0 && y > MAX_INT - x {
return overflow
}
if x < 0 && x < 0 && y < MIN_INT - x {
return overflow
}
乘法溢出
和加法溢出同理
大于 0 时 x > MAX_INT / y 溢出
小于 0 时 x < MIN_INT / y 溢出
乘加溢出
- 先判断乘法是否溢出
- 再判断加法是否溢出
func muladd(a,b,c) overflow
向上溢出的情况
if b > MAX_INT / a overflow a*b > MAX_INT - c overflow
向下溢出的情况
if b < MIN_INT / a overflow a*b < MIN_INT -c overflow