Skip to Content

入門Goプログラミング Lesson8(ビッグナンバー)から学んだこと

LESSON8 ビッグナンバー

指数表現

0がたくさんある時、楽な書き方

shisu1 := 2e8 //推論だとfloat64
var shisu2 int64 = 2e8
fmt.Printf("%T %[1]v\n", shisu1)
fmt.Printf("%T %[1]v\n", shisu2

実行結果

float64 2e+08
int64 200000000

bigパッケージ

試しにuint64の限界

var genkai uint64 = 18446744073709551615
fmt.Printf("%b\n", genkai)
genkai++
fmt.Printf("%b\n", genkai)

実行結果

1111111111111111111111111111111111111111111111111111111111111111
0

直接、uint64 に入らない数字を入れた

var genkai uint64 = 18446744073709551616
fmt.Printf("%v\n", genkai)

実行結果(エラー)

constant 18446744073709551616 overflows uint64
exit status 2

bigパッケージを使う
この使い方ではダメ

package main

import (
	"fmt"
	"math/big"
)

func main() {
	// big.NewInt は int64 で受けてから、big.Int型に返す
	// つまり、int64 から溢れる桁数だったら最初から受け取れない
	genkaiToppa := big.NewInt(18446744073709551616)
	fmt.Printf("%v\n", genkaiToppa)
}

実行結果(エラー)

constant 18446744073709551616 overflows int64
exit status 2

正しいbig.Intの使い方
big.Int を string型から作成する

genkaiToppa := new(big.Int)
genkaiToppa.SetString("18446744073709551616", 10) // 10 は10進数の意味
fmt.Printf("%v\n", genkaiToppa)

桁外れの大きな定数

型なしで定数を宣言すると「型付けなし」になり、オーバーフローにならない

package main

import "fmt"

func main() {
	const genkaiToppa = 18446744073709551616
	var genkai uint64 = genkaiToppa - 1
	fmt.Printf("%T %[1]v", genkai)
}

実行結果

uint64 18446744073709551615

感想

普段使わなさそうだからこそ、手を動かしたら意味がある

参考

なし