2017-02-09 2 views
2

私は、KiB, MiB, ..., ZiB, Yibの値がそれぞれKibiByte, MebiByte, ..., ZebiByte, YobiByteになるようにしています。バイパスする方法整数をシフトしながらint64の値の制限に移動しますか?

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))) 
    } 
} 

しかし、ZiB and YiBオーバーフローの値は行く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 

そうでない場合は、同じシフトロジックとPython3内:

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

の出力は以下の出力のように、正しいです:だから

KiB: 1024 
MiB: 1048576 
GiB: 1073741824 
TiB: 1099511627776 
PiB: 1125899906842624 
EiB: 1152921504606846976 
ZiB: 1180591620717411303424 
YiB: 1208925819614629174706176 

、どのように私はuint64制限を行って、私は、Pythonを使用してシフトする整数から得ることができるもののようなシフトの整数を使用して、正しい値を取得バイパスすることができます。

ありがとうございました。

答えて

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)))) 
} 

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

+0

感謝。それは完全に動作します。 –

関連する問題