どーも!
たかぽんです!
今回はGo言語でint64型をint型に変換する方法をしらべてみようとおもいます!
int64をintに変換する方法!
先日int型のものをint64にするのは以下の記事にて解説をしました。
ただ、その場合に逆はどうなるのかきになったので、調べてみようかなと...!
まぁ、そんなに難しくないのでは?と思うんですが、int型で表せられる数はint64型よりも少ないです。
そのため、本来intで表せられない数をint64にしたらどうなるんだろう・・・?と、気になってしまいました...w
というわけで、やっていくのですが、intに変換するのはとっても簡単です。
castedValue = int(value)
これだけです...!w
なんとなく察してはいました(int64と同じ感じなんだろうなと...)が、簡単だ...!
ちなみに、実際のコード例は以下のような感じになります。
package main
import "fmt"
func main(){
var value int64
value = 10;
fmt.Printf("%T value: %d\n", value, value)
fmt.Printf("%T value: %d\n", int(value), value)
}
// 出力結果
int64 value: 10
int value: 10
出力をみても問題なくint64からint型へキャストされていることがわかります。
では気になるのが、本来int型で表現できない値を変換しようとするとどうなるのかを確認しておきます。
intで表せられない数をint64で変換するとどうなる?
ではやっていきましょう!
以下を試してみます。
func main(){
var bigNum int64
bigNum = 9223372036854775807
fmt.Printf("%T value: %d\n", int(bigNum), bigNum)
}
良かったら皆さんも実行してみてください。
これで、int64の表現可能なギリギリの値をint型に変えてみます...!
すると...?
int value: 9223372036854775807
ん...?
普通にできた...
じゃ今度は宣言からintにして1を足してみると...?
package main
import "fmt"
func main(){
var bigNum int
bigNum = 9223372036854775808
fmt.Printf("%T value: %d\n", bigNum, bigNum)
}
# command-line-arguments
./Main.go:6:12: constant 9223372036854775808 overflows int
こけました。
int型はcint64と同じ数を表現できるっぽいです...?
ちょっと不安だったので追加で調べてみました。
すると、公式の解説に以下のような一文が。
The
int
,uint
, anduintptr
types are usually 32 bits wide on 32-bit systems and 64 bits wide on 64-bit systems. When you need an integer value you should useint
unless you have a specific reason to use a sized or unsigned integer type.
ざっくり訳すと...
int, uint, uintptr型は一般的に32bitシステムでは32bit、64bitのシステムでは62bitになります。
符号なしの整数や、サイズ上限を決めた数値が必要でない場合はint型を使うべきです。
といったかんじでしょうか...
おそらくgo言語を動かす際のシステムに依存している形なのかな...?と思います。
なので...32ビットCPUを搭載したPCのローカル環境で動かせばint32とほぼ同等になるし、64bitなら64になる...といった具合なのかな?
筆者が前述のものを試した際はpaizaで試したので、おそらくpaiza側の実行サーバーは64bitなんでしょう...!(int64の最大を超えるとエラーになったので)
ただ、一点謎なのは必要なければ型指定せずにつかうべきだ〜!っていうところは不思議に感じます...
32bitのPCだとint64使わない方が良かったり、使えなかったりするのかな...?
すごい素人目線で考えると、実行環境に依存しないのなら、int64やint32といった形で決め打った方が良さそうな気がします。
この値はint64の範囲で使うのを想定された値なんだな?って可読性上がる気が...
ただ、理由もなく書かれている訳ではないと思うし、最近は32bitのシステムの方が圧倒的に少ないとは思うので、int64と同じ数を扱える...といった認識でいればいいのかな?たぶん。
ただ、一部例外はあるよ!ってかんじですね...!
また、特別な理由がない場合は基本的にintを使った方が良い...というのも頭の片隅に入れておくとよさそうです。
ちなみに、引用させていただいたのは以下のページです。
是非皆さんも読んでみてください。
まとめ
今回はint64をint型に変換する方法を見てみました!
どちらかというと方法はおまけで、int64でしか表現できないはずの数値をint型で扱えるのは何故なのかが中心になってしまいましたが...
一般的にはただのint型はより狭い数しか表現できないのですが、ことGo言語においては、動作システム次第...という結果に。
前の記事も修正しなければ...!
でも気づけて良かったなと思います...!
それでわ!