面试题答案
一键面试package main
import (
"fmt"
"math"
)
func add(a, b int) (int, bool) {
for b != 0 {
carry := a & b
a = a ^ b
b = carry << 1
if a < 0 && b < 0 && a^b >= 0 {
return 0, true
}
if a >= 0 && b >= 0 && a^b < 0 {
return 0, true
}
}
if (a < 0 && math.Abs(float64(a)) > math.MaxInt32) || (a >= 0 && a > math.MaxInt32) {
return 0, true
}
return a, false
}
你可以这样调用这个函数:
func main() {
result, overflow := add(10, 20)
if overflow {
fmt.Println("发生溢出")
} else {
fmt.Printf("结果为: %d\n", result)
}
}
add
函数中,使用for
循环来不断计算进位和无进位的和。carry := a & b
计算进位,因为只有两个对应位都为1时才会产生进位。a = a ^ b
计算无进位的和,因为^
运算符在两个对应位不同时为1。b = carry << 1
将进位左移一位,作为下一轮循环的b
值。
- 在循环中,通过判断
a
、b
和a^b
的符号来检测是否可能发生溢出。 - 循环结束后,再次检查结果
a
是否超出int
类型的范围,如果超出则表示溢出。 - 在
main
函数中调用add
函数,并根据是否溢出输出相应信息。