代表的な型とその表現
swiftにはさまざまな型が存在します。
型とは、値の特性と値の操作を表現したものです。
基本的なよく使う型は下記の6個になります。
Int型:整数を表現し、整数を操作するための四則演算などの機能を持っている。
Double型・Float型:浮動小数点数を表す、またInt型と同じく計算の機能を持っている。
String型:文字列を表現し、基本的な文字列操作の機能を持っている。
Bool型:真偽値を表現する。
Optional型:全てに関連する型として、値があるか空なのかのいずれかを表す。
Any型:任意の値を表す。
今回は、この中のInt型ついて記載します。
数値型
数値に関する型を数値型と言ったりするらしいので、まとめさせていただきます。
数値型は大きく分類すると、整数型と浮動小数点型の2つに分けることができます。
・ 整数型
整数型はその名の通り整数を表す型で、ビット数によって様々な型に分けられます。
その中でも代表的な整数型はInt型になります。
ビット数とは二進数の一桁のことです。
16ビットなら、0110101000010100 のように、0もしくは1が16個続いているというイメージだと思います。
コンピュータは、膨大な量の0と1を読み解き動いているんです・・・。恐ろしい!
Int型のビット数は32ビットのプラットフォーム上では32ビット、
64ビットのプラットフォーム上で64ビットとなります。
Int型の他に、固定ビット数の整数型が存在し、
Int8型、Int16型、Int32型、Int64型が存在します。
それぞれのビット数は型についている数字がビット数になります。
それぞれの整数型には扱える整数の幅が存在します。
Int8型:-128 ~ 127
Int16型:-32,768 ~ 32,767
Int32型:-2,147,483,648 ~ 2,147,483,647
Int64型:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
これらの値を超える整数を代入してしまうとコンパイルエラーが発生します。
let a: Int8 // -128 ~ 127
a = 1000 // コンパイルエラー
エラー内容:Integer literal '1000' overflows when stored into 'Int8'
和訳:整数リテラル「1000」は「Int8」に格納されるとオーバーフローします
今回は、Int8をInt16などにすればコンパイルエラーは出ません。
もしかして、Int16とかの許容範囲を覚えなきゃいけないの・・・? と思うかもしれませんが、
基本的にはInt型を使えば大丈夫かなと思います!
ただ、Int32型なども、使う機会があると思うので、型の存在だけでも覚えておいて損はないかなと思いました。
・ 浮動小数点型
浮動小数点型は浮動小数点方式で小数を表す数値型です。
浮動小数点方式とは、ビットを桁の並びを表す仮装部と小数点の位置を表す小数部の2つに分け、
これらを掛けて少数を表す方式だそうです。
正直よくわからない!(笑)
浮動小数点型 = 小数という認識でいいと思います!
つまり、DoubleもFloatも小数を扱う数値型ということですね。
DoubleとFloat どちらを使えばいいのだろうと思うところですが、
Float型はおよそ10の38乗の正負の値まで表すことができ、
Double型はおよそ10の308乗の正負の値まで表すことができます。
さらに、表現できる値の範囲だけでなく、値の精度も大きく異なります。
Double型は最小でも15桁の精度を持ちますが、
Float型は最小で6桁の精度しか持ちません。
つまりどういうことかというと、
let a: Double = 12345678.9 // 12345678.9
let b: Float = 12345678.9 // 1.234568e+07
というようになります。
Float型の方は、1.2345678 × 10の7乗ということですね。
Floatで何回も計算をすると、どんどん値の誤差が大きくなってきます。
なので、使うとしたらDouble型一択なのかな?と思いますが、そういうわけでもありません。
例えば、端末の画面上の座標に使用されるCGFloat型は、
32ビットのプラットフォーム上ではではFloat型、
64ビットのプラットフォーム上ではではDouble型になります。
一方で、地球上の座標を表す型などでは、より高い精度が求められるので、
どのプラットフォームでもDouble型が使用されるらしいです。
数値型どうしの変換
swiftでは、異なる型どうしの計算や代入が出来ません。
それは、同じ整数型や浮動小数点型でも同様です。
let a: Int = 123
let b: Int64 = a //コンパイルエラー
let c: Float = 1.23
let d: Double = c //コンパイルエラー
数値型を他の数値型に変換するにはイニシャライザを使いキャストします。
各数値型には、他の数値型の値から自動に型を生成するイニシャライザが用意されており、
これらを使用することで数値型どうしの変換が行えます。
let a: Int = 123
let b: Int64 = Int64(a) // 123
let c: Float = 1.23
let d: Double = Double(c) // 1.23
また、変換したい型よりも高い精度の型から代入すると、変換した型の精度に合わせて処理が実行されます。
let a: Float = 1.23
let b: Int = Int(a) // 1
let c: Double = 1.23456789
let d: Float = Float(c) // 1.234568
数値型の比較
数値型には比較演算という、数値型どうしを比較する演算が存在します。
// == : 左辺と右辺が一致する
123 == 456 //false
// != : 左辺と右辺が一致しない
123 != 456 //true
// > : 左辺が右辺より大きい
123 > 456 //false
// >= : 左辺が右辺以上
123 >= 456 //false
// < : 左辺が右辺より小さい
123 < 456 //true
// <= : 左辺が右辺以下
123 <= 456 //true
比較演算も計算と同じで型が一致していないと
コンパイルエラーになりますので注意してください。
比較演算はif文で使用しますので覚えておいて損はしないと思います。
以上、ありがとうございました!