在Go中检测带符号的int溢出

d11wtq

我正在构建一个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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带符号的整数乘法溢出

来自分类Dev

Verilog中的符号乘法溢出检测

来自分类Dev

将带符号的char转换为C中的unsigned int

来自分类Dev

将带符号的char转换为C中的unsigned int

来自分类Dev

是否可以在Visual C ++中很好地定义带符号整数溢出的选项?

来自分类Dev

检测并防止C中无符号的长时间溢出

来自分类Dev

Flex:匹配带符号的int与加/减

来自分类Dev

如何在带符号的int中存储和检索4 sbyte值

来自分类Dev

如何安全地将uint32_t中的带符号字段提取为带符号的数字(int或uint32_t)

来自分类Dev

将24位带符号的int信号转换为16位带符号的int信号

来自分类Dev

C ++ 14中的带符号位字段

来自分类Dev

从char向量中读取带符号的数字

来自分类Dev

Haskell 中从 String 到 Int 的溢出检测转换

来自分类Dev

什么时候可以不声明带符号的int呢?

来自分类Dev

将2个字节转换为带符号的int

来自分类Dev

如何将int转换为带符号的char?

来自分类Dev

用a <32>将bitset <a>转换为带符号的int

来自分类Dev

用a <32>将bitset <a>转换为带符号的int

来自分类Dev

为什么唯一的带符号整数类型会在clang中导致溢出警告

来自分类Dev

SSE2带符号整数溢出是否未定义?

来自分类Dev

类型转换带符号的int转换,就像无符号的int一样

来自分类Dev

检测JButton中的文本溢出

来自分类Dev

JavaScript中的32位带符号整数数学

来自分类Dev

如何在Laravel模式中创建带符号的增量?

来自分类Dev

解析字符串中的带符号数字

来自分类Dev

内存中的C和带符号字节表示

来自分类Dev

如何在Laravel模式中创建带符号的增量?

来自分类Dev

带符号的通用调度

来自分类Dev

带符号的 PHP 表

Related 相关文章

热门标签

归档