Swiftの整数型:符号の有無とデータ範囲の扱い方

整数型の基本構成と環境依存性

Swiftでは数値データを扱う際、符号(正負の記号)の有無に応じて厳密に型が分類されています。符号付きの型には IntInt8Int32Int64 が該当し、符号なしの型には UIntUInt8UInt32UInt64 が用意されています。

特筆すべき点は、Int および UInt が固定長ではないことです。これらは実行されるプラットフォームのネイティブなビット数に応じて自動的にサイズが調整されます。32ビット環境ではそれぞれ Int32UInt32 に、64ビット環境では Int64UInt64 にマッピングされます。現代のAppleデバイスやmacOSの大部分は64ビットアーキテクチャを採用しているため、開発時は64ビット相当として動作するのが一般的です。

// 符号付き整数の宣言例
let primaryValue: Int = 50
let shortSigned: Int8 = -32
let mediumSigned: Int32 = 1024
let longSigned: Int64 = 9_000_000_000

print("基本型(Int): \(primaryValue)")
print("8ビット(Int8): \(shortSigned)")
print("32ビット(Int32): \(mediumSigned)")
print("64ビット(Int64): \(longSigned)")
// 符号なし整数の宣言例
let primaryUnsigned: UInt = 50
let shortUnsigned: UInt8 = 32
let mediumUnsigned: UInt32 = 1024
let longUnsigned: UInt64 = 9_000_000_000

print("基本型(UInt): \(primaryUnsigned)")
print("8ビット(UInt8): \(shortUnsigned)")
print("32ビット(UInt32): \(mediumUnsigned)")
print("64ビット(UInt64): \(longUnsigned)")

符号の有無による値の制約

符号付き型は正数・負数・ゼロのすべてを表現可能ですが、符号なし型はゼロおよび正数のみしか格納できません。コンパイラは型と値の整合性を厳密にチェックするため、符号なし型に負の値を代入しようとすると構文エラーとなります。

// 符号付き型:正数・負数ともに問題なし
let positive: Int = 25
let negative: Int = -25

// 符号なし型:正数のみ許容される
let positiveUnsigned: UInt = 25
// let invalidUnsigned: UInt = -25 // コンパイルエラー:負の値は符号なし型に代入不可

データ範囲の確認とオーバーフローの防止

各整数型には定義された最小値と最大値が存在します。Swiftでは型の静的プロパティとして .min.max が提供されており、実行前に範囲を確認できます。これらの境界を超えた値をリテラルとして直接代入した場合、コンパイラがエラーを検知してビルドを阻止します。

// 符号なし8ビットの範囲確認
let uInt8Lower: UInt8 = UInt8.min
let uInt8Upper: UInt8 = UInt8.max
print("UInt8 の範囲: \(uInt8Lower) 〜 \(uInt8Upper)")

// 符号付き8ビットの範囲確認
let int8Lower: Int8 = Int8.min
let int8Upper: Int8 = Int8.max
print("Int8 の範囲: \(int8Lower) 〜 \(int8Upper)")

実行時の出力結果は以下のようになります。

UInt8 の範囲: 0 〜 255
Int8 の範囲: -128 〜 127

他のビット数を持つ型も同様の規則に従います。重要なのは、値を割り当てる際に必ず定義された範囲内に収まるよう注意することです。

// 範囲内の値:正常に動作
let validByte: Int8 = 100

// 範囲外の値:コンパイル時エラー
// let overflowByte: Int8 = 200 // エラー:値がInt8.max(127)を超えています

Swiftの厳格な型安全性により、意図しないデータ破損や境界値エラーは開発段階で自動的に排除される仕組みとなっています。

タグ: Swift integer-types type-safety swift-basics overflow-handling

6月6日 19:32 投稿