go - 在 Go 中检测有符号整数溢出

标签 go integer-overflow

我正在构建一个 Lisp,如果计算会导致它们溢出,我希望 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

关于go - 在 Go 中检测有符号整数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33641717/

相关文章:

go - 从 golang 中的缓冲读取器读取特定数量的字节

c++ - 防止用户输入会导致整数溢出的值

c - 解决超过 2^32 个子句的 SAT

go - Cadvisor 支持 ELK 堆栈

go - 不用互斥量的goroutines

json - 自定义 JSON 结构 Unmarshal

java - 分配参数类型对整数溢出的影响

c++ - 有符号整数溢出在 C++ 中仍然是未定义的行为吗?

c# - 阻止 ASP.NET 中的整数溢出

json - 从 Golang 中的 JSON 字符串解码 map 片段