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 關注
- 325 瀏覽
添加回答
舉報