我正在构建一个Lisp,如果计算会导致32位整数溢出,我希望32位整数自动切换到64位整数.同样,对于64位溢出,切换到任意大小的整数.
我的问题是,我不知道检测整数溢出的"正确"方法是什么.
a, b := 2147483647, 2147483647
c := a + b
如何有效地判断c是否溢出?
我曾经考虑过总是转换为64位值来进行计算,然后在可能的情况下再次缩小规模,但对于像基本算术一样原始和核心的语言来说,这似乎是昂贵和浪费内存的.
我正在构建一个Lisp,如果计算会导致32位整数溢出,我希望32位整数自动切换到64位整数.同样,对于64位溢出,切换到任意大小的整数.
我的问题是,我不知道检测整数溢出的"正确"方法是什么.
a, b := 2147483647, 2147483647
c := a + b
如何有效地判断c是否溢出?
我曾经考虑过总是转换为64位值来进行计算,然后在可能的情况下再次缩小规模,但对于像基本算术一样原始和核心的语言来说,这似乎是昂贵和浪费内存的.
例如,要检测用于加法的32位整数溢出,
package main
import (
"errors"
"fmt"
"math"
)
var ErrOverflow = errors.New("integer overflow")
func Add32(left, right int32) (int32, error) {
if right > 0 {
if left > math.MaxInt32-right {
return 0, ErrOverflow
}
} else {
if left < math.MinInt32-right {
return 0, ErrOverflow
}
}
return left + right, nil
}
func main() {
var a, b int32 = 2147483327, 2147483327
c, err := Add32(a, b)
if err != nil {
// handle overflow
fmt.Println(err, a, b, c)
}
}
输出:
integer overflow 2147483327 2147483327 0