我正在浏览golang.org上的go
教程,我遇到了一个我部分理解的例子......
MaxInt uint64 = 1<<64 - 1
现在我理解这是将64位放到左边,这将使它成为1,然后是64 0。
我的问题是为什么这是64位数字可以达到的最大整数。最大整数不是111111111....(until the 64th 1)
而不是100000...(until the 64th one)
吗?
答案 0 :(得分:1)
这里一步一步地发生了什么:
选1。
将其移至左侧64位。这很棘手。结果实际上需要65位表示 - 即1后跟64个零。既然我们在这里计算64位值,为什么这甚至编译而不是溢出到0或1或产生编译错误?
它的工作原理是因为用于计算Go中常量的算法有点神奇(https://blog.golang.org/constants),因为它与计算的命名常量的类型无关。您可以说foo uint8 = 1<<415 / 1<<414
和foo
现在是2
。
减去1.这将我们带回64位数字,因为它实际上是11 .... 1(64次),这确实是uint64
的最大值。如果没有这一步,编译器会抱怨我们试图将65位值填入uint64
。
将常量命名为MaxInt
,并为其指定uint64
类型。成功了!
用于计算常数的神奇算法仍有局限性(显然)。大于500的移位会产生有趣的名为stupid shift
错误。