小编典典

Golang常量到底出了什么问题uint64

go

userid := 12345
did := (userid & ^(0xFFFF << 48))

编译此代码时,我得到:

./xxxx.go:511: constant -18446462598732840961 overflows int

您知道这是怎么回事以及如何解决吗?谢谢。


阅读 354

收藏
2020-07-02

共1个答案

小编典典

^(0xFFFF << 48) 是一个无类型的常数,它是一个任意大的值。

0xffff << 480xffff000000000000。取反时,得到-0xffff000000000001(由于补码为-x = ^ x
+ 1或^ x =-(x + 1))。

当您编写时userid := 12345userid获取类型int。然后,当您尝试将&其与未类型化的常量-0xffff000000000001进行()编译时,编译器会认为此常量必须为int。在这一点上,编译器会抱怨,因为该值的大小太大而不能成为int

如果您尝试获取常量0x0000ffffffffffff,则可以使用1<<48 - 1,它将适合您(如果您具有64位整数)。由于如果您的代码int是32位,将永远无法工作,因此您应该int64在代码中使用而不是int使其可移植。

博客文章https://blog.golang.org/constants解释了常量的工作原理,以及为什么它们是常量的背景。

2020-07-02