如何在移位整数时绕过Go int64值限制?

Chi*_*xus 2 python go byte-shifting

我一起去试图得到的值KiB, MiB, ..., ZiB, Yib分别是KibiByte, MebiByte, ..., ZebiByte, YobiByte.

我在Golang的代码是:

package main 
import ( 
    "fmt"
)

func main() {
    s := []string{"KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"}

    for k,v := range(s) {
        fmt.Printf("%s: %v\n", v, 1 << uint64(10 * (k+1)))
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,ZiB and YiB溢出的值Go uint64和这就是为什么我有这个输出:

KiB: 1024
MiB: 1048576
GiB: 1073741824
TiB: 1099511627776         // exceeds 1 << 32
PiB: 1125899906842624
EiB: 1152921504606846976
ZiB: 0                    // exceeds 1 << 64
YiB: 0                    // exceeds 1 << 64
Run Code Online (Sandbox Code Playgroud)

否则,Python3在此代码中使用相同的移位逻辑:

a = ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]
for k,v in enumerate(a):
    print("{}: {}".format(v, 1 << (10 *(k+1))))
Run Code Online (Sandbox Code Playgroud)

输出正确,如下面的输出:

KiB: 1024
MiB: 1048576
GiB: 1073741824
TiB: 1099511627776
PiB: 1125899906842624
EiB: 1152921504606846976
ZiB: 1180591620717411303424
YiB: 1208925819614629174706176
Run Code Online (Sandbox Code Playgroud)

那么,我如何绕过Go uint64限制并使用移位整数获得正确的值,就像我可以通过使用Python移动整数得到的那样.

谢谢.

Jim*_*imB 9

您不能使用原始uint64需要超过64位的数字.Python具有任意精度整数,要在Go中获得相同的结果,您需要使用该math/big包.

s := []string{"KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"}

one := big.NewInt(1)
for k, v := range s {
    fmt.Printf("%s: %v\n", v, new(big.Int).Lsh(one, uint(10*(k+1))))
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/i5v5P5QgQb