数値型

数値型には整数型と浮動小数点数型があります。

整数型

最大値 最小値
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)