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