前回、整数と小数を組み合わせて計算しようとしたところでエラーにになってしまいました。 その原因は、整数と小数という異なるデータの種類の変数の間で計算しようとしたからです。 今回は、データの種類、プログラミング用語でいうデータ型について説明したいと思います。
データ型ってなんだ?
データ型とは、整数や小数、文字列といったデータ(値)の種類のことです。 ブログラミング言語では、このデータ型によってどのような計算(処理)ができるかや、どれくらいの範囲の値を扱うことができるかが決まります。
例えば、 + という計算(処理)は整数では足し算という処理になります。 しかし、同じ + でも、これを文字列に使うと文字列を結合するという違う処理になります。
var num1 = 10
var num2 = 1200
// 整数と整数の間の+の計算は足し算
print(num1 + num2)
var str1 = "This is "
var str2 = "a pen."
// 文字列と文字列の間の+は文字列の結合
print(str1 + str2)
1210
This is a pen.
また、同じ整数や小数であっても、表現できる数字の大きさや精度が違うものもあります。
変数にデータ型を指定する
それぞれの変数は、必ずデータ型が決まっています。 今まで、変数を宣言した時に「データ型はコレ」という指定をしていませんでした。 そのような場合にも、実は初期化の値から適切なデータ型が変数に自動で割り当てられいるのです。
変数にデータ型を指定するには、次のように記載します。
var 変数名: データ型
実際にプログラムすると次のようになります。
// num1をint8型の変数として宣言する
var num1:Int8
num1 = 10
print(num1)
// num2をint16型の変数として宣言する
var num2:Int16
num2 = 110
print(num2)
初期化を同時にすることも可能です。
// num1をint8型の変数として宣言する
var num1:Int8 = 10
print(num1)
// num2をint16型の変数として宣言する
var num2:Int16 = 110
print(num2)
なお、同じ整数であっても、データ型が違うことに変わりはないので一緒に計算できないことに注意しましょう。
// num1をint8型の変数として宣言する
var num1:Int8 = 10
print(num1)
// num2をint16型の変数として宣言する
var num2:Int16 = 110
print(num2)
// データ型が違うのでエラー
print(num1 + num2)
データ型を変換する
データ型が違うからといって、計算できないのでは困ってしまいますね。 そのため、あらかじめデータ型を変換する機能が用意されています。 試しに使ってみましょう。
var num1:Int8 = 10
print(num1)
var num2:Int16 = 110
print(num2)
// num2をInt8に変換する
print(num1 + Int8(num2))
10
110
120
最後の Int8(num2) に注目してください。 このようにデータ型の後ろにカッコをつけて、その中に元の変数を入れてあげると、Int8のデータが出来上がります。
ここにも、2つ注意しないといけないポイントがあります。 まず最初のポイントは、この処理はnum2をベースにしてInt8型のデータを新しく作るという処理だということです。 つまり、元のnum2のデータ型がInt16からInt8に変わったわけでないのです。
もう1つのポイントは、データ型が表せる値の範囲に気をつけないといけないということです。 試しに、num2の値を変更してみましょう。
var num1:Int8 = 10
print(num1)
// num2の値を変更するjjjjjj
var num2:Int16 = 120
print(num2)
// 10 + 120 = 130 となり
// Int8で表現できる値を範囲を超えてしまいエラーになる
print(num1 + Int8(num2))
このように、データ型の扱える値の範囲を超えてしまうとエラーになってしまいます。 基本的な数値を扱う基本的なデータ型の一覧は、この記事の最後に記載してあります。
数値と文字列の変換
このデータ型の変換は、数値の間だけでしかできないというわけではありません。 数値→文字列や文字列→数値にも変換できます。
var num = 123
var str = "456"
// strをIntに変換して足し算する
print(num + Int(str)!)
// numをStringに変換して文字列をくっつける
print(String(num) + str)
579
123456
5行目のInt(str)の後ろに ! がついているのは、Int(str)の結果には必ず何か値があるよということを保証する、という意味です。 コレはオプショナル型をアンラップするということなのですが、この話は長くなってしまうため、別のところで説明したいと思います。
数値を表すデータ型
それでは最後に、基本的な数値を表すデータ型をまとめておきます。
データ型 | 名前 | 最小値 | 最大値 |
---|---|---|---|
Int | 符号付整数 | Int64/32と同じ | Int64/32と同じ |
UInt | 符号無し整数 | UInt64/32と同じ | UInt64/32と同じ |
Double | 倍精度浮動小数点数 | ||
Double | 浮動小数点数 | ||
Int8 | 8bit符号付整数 | -128 | 127 |
UInt8 | 8bit符号無し整数 | 0 | 255 |
Int16 | 16bit符号付整数 | -32,768 | 32,767 |
UInt16 | 16bit符号無し整数 | 0 | 65,535 |
Int32 | 32bit符号付整数 | -2,147,483,648 | 2,147,483,647 |
UInt32 | 32bit符号無し整数 | 0 | 4,294,967,295 |
Int64 | 64bit符号付整数 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
UInt64 | 64bit符号無し整数 | 0 | 18,446,744,073,709,551,615 |
Int/UIntは64bitコンピュータではInt64/UInt64と32bitコンピュータではInt32/UInt32と同じ範囲になります。
また、IntとDoubleはそれぞれ特にデータ型を指定せずに整数/小数で初期化した場合のデフォルトです。
ちなみに、IntはSigned Integer、UIntはUnsigned Integer、FloatはFloat Point Number、DoubleはDouble Precision Float Point Numberの略です。