Goの整数型

最近goを勉強し始めたので、備忘録としてgoの整数型についてまとめます。

符号あり整数

サイズ(bit) 最小値 最大値
int8 8 -128 127
int16 16 -32768 32767
int32(rune) 32 -2147483648 2147483647
int64 64 -9223372036854775808 9223372036854775807

確認するにはmath.MinXXX, math.MaxXXXを使います。

package main

import (
  "fmt"
  "math"
)

func main() {
  fmt.Printf("%d, %d", math.MinInt8, math.MaxInt8)
  fmt.Printf("%d, %d", math.MinInt16, math.MaxInt16)
  fmt.Printf("%d, %d", math.MinInt32, math.MaxInt32)
  fmt.Printf("%d, %d", math.MinInt64, math.MaxInt64)
}

符号なし整数

サイズ(bit) 最小値 最大値
uint8(byte) 8 0 255
uint16 16 16 65535
uint32 32 32 4294967295
uint64 64 64 18446744073709551615
uintptr * * *

uintptrポインターの値を指します。

確認するにはmath.MaxXXXを使います。最小値は常に0なのでメソッドは存在しません。

注意点としては、戻り値は明示的に指定しない限りintであるということです。また型推論では常にintになります。
従って、math.MaxUint32まではintで表せますが、math.MaxUint64intでは表せないので、変数に代入する場合は型を明示的に指定する必要があります。
fmt.Printlnなどで出力する場合は、型キャストが必要です。

package main

import (
  "fmt"
  "math"
  "reflect"
)

func main() {
  fmt.Println(reflect.TypeOf(math.MaxUint16)) // => int
  fmt.Println(math.MaxUint32) // => 4294967295

  i := math.MaxUint64 // => constant 18446744073709551615 overflows int
  var j uint64 = math.MaxUint64
  fmt.Println(i) // => 18446744073709551615

  fmt.Println(math.MaxUint64) // => constant 18446744073709551615 overflows int
  fmt.Println(uint64(math.MaxUint64)) // => 18446744073709551615
}

特別な理由がない限り、整数を定義するときはintにすべきです。
型推論ではintが採用されるのは前述の通りですが、intは実装系に依存し、32bit系ではint32, 64bit系ではint64と同じです。

浮動小数

サイズ(bit) 最小値 最大値
float32 32
float64 64

複素数

サイズ(bit) 最小値 最大値
complex64 float32の実部と虚部から成る
complex128 float64の実部と虚部から成る

complex()複素数を生成できる。