valueOfTypeB = typeB(valueOfTypeA)
タイプBの値 = タイプB(タイプAの値)
例:
a := 5.0
b := int(a)
型変換は、値の範囲が小さい型から値の範囲が大きい型への変換 (int16 から int32 への変換) など、適切に定義されている場合にのみ成功します。値の範囲が大きい型から値の範囲が小さい型 (int32 から int16、または float32 から int) に変換すると、精度の損失 (切り捨て) が発生します。
相互に変換できるのは同じ基底型の変数のみです (int16 型を int32 型に変換するなど)。異なる基底型の変数を相互に変換するとコンパイル エラーが発生します (bool 型を int 型に変換するなど)。タイプ):
package main
import (
"fmt"
"math"
)
func main() {
//各値の範囲を出力します
fmt.Println("int8 range:", math.MinInt8、math.MaxInt8)
fmt.Println("int16 range:", math.MinInt16、math.MaxInt16)
fmt.Println("int32 range:", math.MinInt32、math.MaxInt32)
fmt.Println("int64 range:", math.MinInt64、math.MaxInt64)
//32ビット整数値を初期化します
var a int32 = 1047483647
//変数の16進形式と10進値を出力します
fmt.Printf("int32: 0x%x %d\n", a、a)
// a変数の値を16進数に変換して、値が切り捨てられる
b:= int16(a)
//変数の16進形式と10進値を出力します
fmt.Printf("int16: 0x%x %d\n", b、b)
//定数をfloat32型として保存します
var c float32 = math.Pi
// int型に変換し、浮動小数点が失われます
fmt.Println(int(c))
}
コードの説明は次のとおりです。
- 行 11 ~ 14 は、いくつかの一般的な整数型の値の範囲を出力します。
- 17 行目で、int32 型の変数 a が宣言され、初期化されます。
- 19 行目では、fmt.Printf の
%x
動詞を使用して値を 16 進形式で出力し、変換前の a の 32 ビット値を出力します。 - 22行目では、aの値をint16型、つまり32ビット符号付き整数から16ビット符号付き整数に変換していますが、int16型はint32型に比べて値の範囲が狭いため、値はDoとなります。切り捨て(精度の損失)。
- 24 行目では、変数の変換された値、つまり b の値を出力します。これも 16 進数と 10 進数で出力されます。
- 27 行目では、 math.Pi は math パッケージの定数です。デフォルトでは型がなく、参照される実際の型に従って自動的に推定されます。ここでは、 math.Pi は変数 c に割り当てられているため、型はfloat32です。
- 29行目、float32をint型に変換して出力します。
コード出力は次のとおりです。
int8 range: -128 127
int16 range: -32768 32767
int32 range: -2147483648 2147483647
int64 range: -9223372036854775808 9223372036854775807
int32: 0x3e6f54ff 1047483647
int16: 0x54ff 21759
3
出力結果によると、16ビット符号付き整数の範囲は-32768~32767ですが、変数aの値1047483647はこの範囲にありません。 1047483647 に対応する 16 進数値は 0x3e6f54ff ですが、int16 型に変換すると長さが半分に短縮され、つまり 16 進数値が半分になって 0x54ff となり、10 進数値は 21759 となります。
浮動小数点数を整数に変換すると、小数部分が削除され、整数部分のみが保持されます。