userid := 12345 did := (userid & ^(0xFFFF << 48))
编译此代码时,我得到:
./xxxx.go:511: constant -18446462598732840961 overflows int
您知道这是怎么回事以及如何解决吗?谢谢。
^(0xFFFF << 48) 是一个无类型的常数,它是一个任意大的值。
^(0xFFFF << 48)
0xffff << 48是0xffff000000000000。取反时,得到-0xffff000000000001(由于补码为-x = ^ x + 1或^ x =-(x + 1))。
0xffff << 48
0xffff000000000000
-0xffff000000000001
当您编写时userid := 12345,userid获取类型int。然后,当您尝试将&其与未类型化的常量-0xffff000000000001进行()编译时,编译器会认为此常量必须为int。在这一点上,编译器会抱怨,因为该值的大小太大而不能成为int。
userid := 12345
userid
int
&
如果您尝试获取常量0x0000ffffffffffff,则可以使用1<<48 - 1,它将适合您(如果您具有64位整数)。由于如果您的代码int是32位,将永远无法工作,因此您应该int64在代码中使用而不是int使其可移植。
0x0000ffffffffffff
1<<48 - 1
int64
博客文章https://blog.golang.org/constants解释了常量的工作原理,以及为什么它们是常量的背景。