如果溢出发生在功能中,则使用UINT64类型的溢出错误



为什么以下代码在没有溢出错误的情况下工作?(如果在功能中发生溢出,则使用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

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

根据语言规格的"整数操作"部分:

移位计数没有上限。

所以您看到的行为是打算的。

请注意,如果您要为两个操作数使用常数,则编译器将尝试用常数替换该语句,该语句 May 溢出您的定义类型:

x := uint64(1) << 500
// ERROR: constant ... overflows uint64

但是,您可以以任何值,任何数量的次数移动任何整数:

x, y := uint64(1), uint64(0xffffffff)
for {
  x <<= y
}
// OK: x definitely has no bits set 👍

最新更新