Jon*_*ang 2 integer-overflow go
userid := 12345
did := (userid & ^(0xFFFF << 48))
Run Code Online (Sandbox Code Playgroud)
在编译这段代码时,我得到了:
./xxxx.go:511: constant -18446462598732840961 overflows int
你知道这件事有什么关系吗?如何解决?谢谢.
Pau*_*kin 10
^(0xFFFF << 48) 是一个无类型的常量,它在任意大的值.
0xffff << 48是0xffff000000000000.当你否定它时,你得到-0xffff000000000001(因为有两个补码,-x = ^ x + 1,或^ x = - (x + 1)).
写作时userid := 12345,userid获取类型int.然后,当您尝试&使用无类型常量和()时,-0xffff000000000001编译器会认为此常量需要为int.此时,编译器会抱怨,因为该值太大而不是int.
如果你试图获得常数0x0000ffffffffffff,那么你可以使用1<<48 - 1,哪个(如果你有64位整数),将适合.由于你的代码int在32位时永远不会工作,所以你应该int64在你的代码中使用int它而不是让它可移植.
博客文章https://blog.golang.org/constants解释了常量的工作原理,以及它们为何如此的背景.
| 归档时间: |
|
| 查看次数: |
4599 次 |
| 最近记录: |