uint64类型的溢出错误,如果在函数中发生溢出

时间:2018-02-22 18:27:34

标签: go

为什么下面的代码没有溢出错误?: (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))),"")}

https://play.golang.org/p/0iiUlCiYTDR

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