func main() {
var a uint8 = math.MaxUint8
fmt.Println(a)
fmt.Println(a + a)
}
// 结果居然是 254 ,和溢出的计算方法一样,去掉了字节高位 但是为什么呢 不符合大众的预期啊 感谢感谢
func main() {
var a uint8 = math.MaxUint8
fmt.Println(a)
fmt.Println(a + a)
}
// 结果居然是 254 ,和溢出的计算方法一样,去掉了字节高位 但是为什么呢 不符合大众的预期啊 感谢感谢
func add[signed ~int | ~int8 | ~int16 | ~int32 | ~int64](x, y signed) signed {
s := x + y
if (x^s)&(y^s) < 0 { // (+) + (+) = (-) || (-) + (-) = (+)
panic("signed overflow")
}
return s
}
func subtract[signed ~int | ~int8 | ~int16 | ~int32 | ~int64](x, y signed) signed {
d := x - y
if (x^y)&(x^d) < 0 { // (+) - (-) = (-) || (-) - (+) = (+)
panic("signed overflow")
}
return d
}