为什么下面的代码没有溢出错误?: (uint64类型的溢出错误,如果在函数中发生溢出)
package main
func foo(i uint64) int{
return (1 << i)
}
func main() {
foo(99)
}
简单的bar := 1 << 99
会导致错误。如果你bar := 1 << 99
prog.go:11:9: constant 633825300114114700748351602688 overflows int
,则bar := 1 << 512
。
而prog.go:11:11: shift count too large: 512
给出了{=IFERROR(INDEX($A$1:$H$1,0,SMALL(IF(INDIRECT("$A$"&SMALL(IF($A$1:$A$5=B$7,ROW($A$1:$A$5)),1)&":$H$"&SMALL(IF($A$1:$A$5=B$7,ROW($A$1:$A$5)),1))="X",COLUMN($A$1:$H$1)),ROW(1:1))),"")}
答案 0 :(得分:1)
根据"Integer Operations" section of the language spec:
班次计数没有上限。
所以你看到的行为是有意的。
请注意,如果您对两个操作数都使用常量,那么编译器将尝试用常量替换该语句,可能溢出您定义的类型:
x := uint64(1) << 500
// ERROR: constant ... overflows uint64
但是,您可以按任意值移动任何整数:
x, y := uint64(1), uint64(0xffffffff)
for {
x <<= y
}
// OK: x definitely has no bits set