数値型には整数型と浮動小数点数型があります。
整数型
型 | 最大値 | 最小値 |
---|---|---|
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 |
UInt8 | 0 | 255 |
UInt16 | 0 | 65,535 |
UInt32 | 0 | 4,294,967,295 |
UInt64 | 0 | 18,446,744,073,709,551,615 |
整数値は特に範囲やメモリサイズを意識しない場合は通常は、Intを使います。型を明示せずに整数値を初期値として代入すると暗黙的な型はIntになります。
Intは実行環境のワード長に依存します。64ビットのMac OSXの場合、Int64と同等です。また、符号無し整数として、UIntを使用できます。これもサイズは実行環境に依存します。
var width: Int8
width = 200
let height = 300 // 型を指定しない場合はInt
var age: UInt
age = -1 // 符号無し整数にマイナス値を代入するとエラー
// min, maxで最大値、最小値を取得可能
print(Int.min, Int.max) // (-9223372036854775808, 9223372036854775807) *結果は環境に依存
var h = 0xff // 16進数 255
var o = 0o10 // 8進数 8
var b = 0b0100 // 2進数 4
let leadingZero = 000123 // 前ゼロ 123
// 下の様に、読み易い様に_(下線)で区切って記述できる
let population = 128_057_352 // 128,057,352
浮動小数点数型
Swiftのデフォルトの浮動小数点数型は、Doubleで、64ビット長です。この他に32ビット長のFloatもあります。
let pi = 3.14159 // デフォルトはDouble
var angle: Float = 45.2
var radian = Double(angle) * pi / 180.0
次のように、型を指定せずに、整数と浮動小数点数の計算式を初期値として与えた場合、変数の型はDoubleになります。
let height = 170 + 2.345 // Double
但し、Int型とDouble型の変数同士を直接計算することはできません。その場合は型の変換が必要です。
let i = 170
let d = 2.345
let dd = i + d // ×これはエラー
// 型変換が必要
let dd = Double(i) + d // これはオッケー
違う型への変換は暗黙的には行われません。上の例のように、型が違う数値同士の計算をする場合は、型を明示的に変換して統一して計算する必要があります。Swiftは型に厳密な言語で、例えば、IntとUIntの場合でも型変換が必要です。
数値の指数表記や前ゼロ装飾等も可能です。
var d1 = 123.456 // 123.456
var d2 = 1.23456e2 // 123.456
let leadingZero = 000123.456 // 前ゼロ 123.456
let bignumber = 123_456_789.012 // 123,456,789.012
16進数での指数表記も出来ます。次の様に、pの後に2の累乗の指数部を指定します。
let val1 = 0xFp3 // = 15 * 23
let val2 = 0xCp-2 // = 12 * 2-2
let val3 = 0xC.5p2 // (12 + (5 / 16)) * 22
let val4 = 0xC.3p0 // (12 + (3 / 16)) * 20
数値の演算
一般的な他の言語同様、四則演算や比較ができます。
1 + 2 // 3(足し算)
12.3 - 4 // 8.3(引き算)
45 / 5.0 // 9.0(割り算)
2 * 3.5 // 7.0(かけ算)
剰余計算は整数だけでなく、浮動小数点数でも可能です。
11 % 3 // 2
-11 % 3 // -2
11 % 3.5 // 0.5
11.5 % 2.5 // 1.5
インクリメント、デクリメントも整数だけでなく浮動小数点数でも可能です。
var a = 10
a += 3 // 13
a -= 2 // 11
++a // 12
var b = a++ // b=12, a=13
//
var f = 12.3
++f // 13.3
f += 5.2 // 18.5
オーバーフロー演算子
型が持つ範囲を超えた値を設定しようとするとエラーになりますが、オーバーフロー演算子を使うとエラーを発生させず、シフト演算子を使った場合のようにローテートした値が設定されます。
オーバーフロー演算子には次のような種類があります。
演算子 | 意味 |
---|---|
&+ | 加算 |
&- | 減算 |
&* | 乗算 |
&/ | 除算 |
&% | 剰余 |
var a = Int8.max // 127
a += 1 // オーバーフローとなりエラーが発生する
a &+ 1 // -128 = Int8.min になる
var b = UInt8.max // 255
b &+ 1 // 0 = UInt8.min になる
var c = UInt8.min // 0
c &- 1 // 255 = UInt8.max
数値をゼロで除算するとエラーになりますが、&/ を使うとエラーにならず、結果はゼロになります。
let a = 100 / 0 // エラー
let b = 100 &/ 0 // 0
数値の比較
比較演算の結果はBool型です。
var a = 10
var b = 11
a == b // false
a != b // true
a > b // false
a < b // true
a >= b // false
a <= b // true
ビット演算
Swiftはビット演算も可能です。演算子はC言語のものと同じです。
ビット反転は~を使います。
let bits: UInt8 = 0b00001111
let invertedBits = ~bits // 0b11110000
ANDとORはそれぞれ、&と|を使います。
// AND
let bits = 0b00001111 & 0b00111100 // 0b00001100
// OR
let bits = 0b00001111 | 0b00111100 // 0b00111111
XORは、^を使います。
let bits = 0b00001111 ^ 0b00111100 // 0b00110011
シフト演算は、左シフトが<<、右シフトが>>です。
// 左シフト(論理シフト)
let bits:UInt8 = 0b11001100 << 2 // 0b00110000
// 右シフト(論理シフト)
let bits:UInt8 = 0b11001100 >> 2 // 0b00110011
符号付き整数にシフト演算を行うと算術シフト(符号ビットはそのまま)になります。
// 左シフト(算術シフト)
let bits:Int8 = -32 // 0b11100000
bits << 2 // 0b10000000 (-128)
// 右シフト(算術シフト)
let bits:Int8 = -32 // 0b11100000
bits >> 2 // 0b11111000 (-8)