如何在 Go 中实现溢出处理

问题描述 投票:0回答:1

我正在编码,我想添加太多从用户那里得到的数字。我认为如果这些数字相加的结果大于 int64,它应该给出错误并指示溢出。

我尝试了很多,但没有得到正确的结果。

我希望如果一个数字大于 int64 的最大值,它应该会给我一个溢出错误。

go max overflow addition int64
1个回答
0
投票

查看SEI CERT C 编码标准INT32-C。确保对有符号整数的操作不会导致溢出。将 C 签名 int 兼容解决方案翻译为 Go int64。


package main

import (
    "fmt"
    "math"
)

/*
SEI CERT C Coding Standard
INT32-C. Ensure that operations on signed integers do not result in overflow
https://wiki.sei.cmu.edu/confluence/display/c/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow
Compliant Solution
*/
func sum(a, b int64) (int64, error) {
    if ((b > 0) && (a > (math.MaxInt64 - b))) ||
        ((b < 0) && (a < (math.MinInt64 - b))) {
        err := fmt.Errorf("overflow: %d + %d", a, b)
        return 0, err
    } else {
        return a + b, nil
    }
}

func main() {
    fmt.Println(sum(42, -24))
    fmt.Println(sum(math.MaxInt64, +0))
    fmt.Println(sum(math.MinInt64, -0))
    fmt.Println(sum(math.MaxInt64, 1))
    fmt.Println(sum(math.MinInt64, -1))
}

https://go.dev/play/p/kv5nMtAlftu

18 <nil>
9223372036854775807 <nil>
-9223372036854775808 <nil>
0 overflow: 9223372036854775807 + 1
0 overflow: -9223372036854775808 + -1
© www.soinside.com 2019 - 2024. All rights reserved.