Goは整数データ型を広範囲にサポートしています。では、それらが何であるかを見ていきましょう。
Goの符号付き整数(integer)
Golangがサポートする符号付き整数型は以下のとおりです。
int8 | 8ビットの符号付き整数で、範囲は-128から127まで。 |
int16 | 16ビットの符号付き整数で、範囲は-32768~32767。 |
int32 | 32ビットの符号付き整数で、範囲は-2147483648~2147483647。 |
int64 | 64ビットの符号付き整数で、範囲は-9223372036854775808~9223372036854775807。 |
Goの符号なし整数(integer)
Golangがサポートする符号なし整数型は以下のとおりです。
uint8 | 0から255までの8ビット符号なし整数。 |
uint16 | 0 から 65535 までの 16 ビット符号なし整数。 |
uint32 | 0 から 4294967295 までの 32 ビット符号なし整数。 |
uint64 | 0 から 18446744073709551615 までの 64 ビット符号なし整数。 |
Goにおける整数のオーバーフロー
型を割り当てた後、型の範囲より大きな数値を使って割り当てると、失敗します。
以下のコードは、まさにそれを示しているプログラムです。
package main
import (
"fmt"
)
func main() {
var x uint8
fmt.Println("Throws integer overflow")
x = 285 // uint8の範囲は0〜255だから失敗する
}
Goの型変換
現在の範囲より低い範囲を持つ型に変換すると、データ損失が発生します。
型変換を行う関数として、変数名を直接使って型キャストを行います。
package main
import (
"fmt"
)
func main() {
var x int32
var y uint32 // range 0 to 4294967295
var z uint8 // range 0 to 255
x = 26700
y = uint32(x) // 数値が範囲内であるため、データが保存される
z = uint8(x) // 範囲外変換のためデータが損失する
fmt.Println(y, z)
}
出力結果は以下の通りです。
26700 76