我正在编码,我想添加太多从用户那里得到的数字。我认为如果这些数字相加的结果大于 int64,它应该给出错误并指示溢出。
我尝试了很多,但没有得到正确的结果。
我希望如果一个数字大于 int64 的最大值,它应该会给我一个溢出错误。
查看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