2 回答

TA贡献1804条经验 获得超7个赞
您引用的规范特指“操作 +、-、* 和 <<”的结果。您正在尝试定义一个常量,而不是查看其中一个操作的结果。
您也不能将那些过大的值用于这些操作的输入。编译器不会为您包装任何值;这只是这些操作的运行时行为。
package main
import "fmt"
func main() {
var num uint32 = 1 + 1 << 35
fmt.Printf("num = %v\n", num)
}
prog.go:6: constant 34359738369 overflows uint32
[process exited with non-zero status]
这是一个有趣的例子。
var num uint32 = (1 << 31) + (1 << 31)
fmt.Printf("num = %v\n", num)
prog.go:6: constant 4294967296 overflows uint32
[process exited with non-zero status]
在这种情况下,编译器尝试(1 << 31) + (1 << 31)在编译时进行求值4294967296,生成常量 value ,该值太大而无法容纳。
var num uint32 = (1 << 31)
num += (1 << 31)
fmt.Printf("num = %v\n", num)
num = 0
在这种情况下,加法是在运行时执行的,并且值会按照您的预期回绕。
- 2 回答
- 0 关注
- 310 浏览
添加回答
举报